| // Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file | |
| // for details. All rights reserved. Use of this source code is governed by a | |
| // BSD-style license that can be found in the LICENSE file. | |
| import 'package:analyzer/dart/ast/ast.dart'; | |
| /// Return the raw text of the given comment node. | |
| String? getCommentNodeRawText(Comment? node) { | |
| if (node == null) return null; | |
| var tokens = node.tokens; | |
| var count = tokens.length; | |
| if (count == 1) { | |
| // The comment might be a block-style doc comment with embedded end-of-line | |
| // markers. | |
| return tokens[0].lexeme.replaceAll('\r\n', '\n'); | |
| } | |
| var buffer = StringBuffer(); | |
| for (var i = 0; i < count; i++) { | |
| if (i > 0) { | |
| buffer.write('\n'); | |
| } | |
| buffer.write(tokens[i].lexeme); | |
| } | |
| return buffer.toString(); | |
| } | |
| /// Return the plain text from the given DartDoc [rawText], without delimiters. | |
| String? getDartDocPlainText(String? rawText) { | |
| if (rawText == null) return null; | |
| // Remove /** */. | |
| var isBlock = false; | |
| if (rawText.startsWith('/**')) { | |
| isBlock = true; | |
| rawText = rawText.substring(3); | |
| if (rawText.endsWith('*/')) { | |
| rawText = rawText.substring(0, rawText.length - 2); | |
| } | |
| } | |
| rawText = rawText.trim(); | |
| // Remove leading '* ' and '/// '. | |
| var result = StringBuffer(); | |
| var lines = rawText.split('\n'); | |
| for (var line in lines) { | |
| line = line.trim(); | |
| if (isBlock && line.startsWith('*')) { | |
| line = line.substring(1); | |
| if (line.startsWith(' ')) { | |
| line = line.substring(1); | |
| } | |
| } else if (!isBlock && line.startsWith('///')) { | |
| line = line.substring(3); | |
| if (line.startsWith(' ')) { | |
| line = line.substring(1); | |
| } | |
| } | |
| if (result.isNotEmpty) { | |
| result.write('\n'); | |
| } | |
| result.write(line); | |
| } | |
| return result.toString(); | |
| } | |
| /// Return the DartDoc summary, i.e. the portion before the first empty line. | |
| String? getDartDocSummary(String? completeText) { | |
| if (completeText == null) { | |
| return null; | |
| } | |
| var lines = completeText.split('\n'); | |
| int count = lines.length; | |
| if (count == 1) { | |
| return lines[0]; | |
| } | |
| var result = StringBuffer(); | |
| for (var i = 0; i < count; i++) { | |
| var line = lines[i]; | |
| if (i > 0) { | |
| if (line.isEmpty) { | |
| return result.toString(); | |
| } | |
| result.write('\n'); | |
| } | |
| result.write(line); | |
| } | |
| return result.toString(); | |
| } |