Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(34)

Unified Diff: compiler/java/com/google/dart/compiler/parser/CommentPreservingParser.java

Issue 10661022: Issue 3752. Support for @override annotations (as structured doc comments) (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 8 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: compiler/java/com/google/dart/compiler/parser/CommentPreservingParser.java
diff --git a/compiler/java/com/google/dart/compiler/parser/CommentPreservingParser.java b/compiler/java/com/google/dart/compiler/parser/CommentPreservingParser.java
deleted file mode 100644
index d2194128f1d8d7d6ab96a4eb12cca3d0ea57c768..0000000000000000000000000000000000000000
--- a/compiler/java/com/google/dart/compiler/parser/CommentPreservingParser.java
+++ /dev/null
@@ -1,267 +0,0 @@
-// Copyright (c) 2012, 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.
-
-package com.google.dart.compiler.parser;
-
-import com.google.dart.compiler.DartCompilerListener;
-import com.google.dart.compiler.DartSource;
-import com.google.dart.compiler.Source;
-import com.google.dart.compiler.ast.ASTVisitor;
-import com.google.dart.compiler.ast.DartComment;
-import com.google.dart.compiler.ast.DartDeclaration;
-import com.google.dart.compiler.ast.DartField;
-import com.google.dart.compiler.ast.DartMethodDefinition;
-import com.google.dart.compiler.ast.DartNode;
-import com.google.dart.compiler.ast.DartUnit;
-import com.google.dart.compiler.common.SourceInfo;
-import com.google.dart.compiler.metrics.CompilerMetrics;
-import com.google.dart.compiler.util.DartSourceString;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
-
-/**
- * A parser for Dart that records comment positions.
- */
-public class CommentPreservingParser extends DartParser {
-
- private static class CommentParserContext extends DartScannerParserContext {
-
- private List<int[]> commentLocs;
- private String source;
-
- CommentParserContext(Source source, String code,
- DartCompilerListener listener) {
- super(source, code, listener);
- this.source = code;
- }
-
- CommentParserContext(Source source, String code,
- DartCompilerListener listener, CompilerMetrics metrics) {
- super(source, code, listener, metrics);
- this.source = code;
- }
-
- List<int[]> getCommentLocs() {
- return commentLocs;
- }
-
- @Override
- protected DartScanner createScanner(String sourceCode) {
- commentLocs = new ArrayList<int[]>();
- return this.new CommentScanner(sourceCode);
- }
-
- private class CommentScanner extends DartScanner {
-
- CommentScanner(String sourceCode) {
- super(sourceCode);
- }
-
- @Override
- protected void recordCommentLocation(int start, int stop, int line, int col) {
- int size = commentLocs.size();
- if (size > 0) {
- // the parser may re-scan lookahead tokens
- // fortunately, comments are always scanned as comments
- int[] loc = commentLocs.get(size - 1);
- if (start <= loc[0] && stop <= loc[1]) {
- return;
- }
- }
- commentLocs.add(new int[]{start, stop, line, col});
- }
- }
- }
-
- /**
- * Create a parsing context for the comment-recording parser.
- */
- public static CommentParserContext createContext(Source source, String code,
- DartCompilerListener listener) {
- return new CommentParserContext(source, code, listener);
- }
-
- /**
- * Create a parsing context for the comment-recording parser.
- */
- public static CommentParserContext createContext(Source source, String code,
- DartCompilerListener listener, CompilerMetrics metrics) {
- return new CommentParserContext(source, code, listener, metrics);
- }
-
- private CommentParserContext context;
- private boolean onlyDartDoc;
-
- /**
- * Create a parser on the given <code>code</code> that records comment locations.
- */
- public CommentPreservingParser(String code) {
- this(code, null, false);
- }
-
- /**
- * Create a parser on the given <code>code</code> that records some comment
- * locations. If <code>onlyDartDoc</code> is <code>true</code> then only
- * DartDoc comments will be recorded, otherwise all comments will be recorded.
- * The given <code>listener</code> will be used to inform clients of errors.
- */
- public CommentPreservingParser(String code, DartCompilerListener listener,
- boolean onlyDartDoc) {
- this(createContext(null, code, listener), onlyDartDoc);
- }
-
- /**
- * Create a parser with the given parsing context <code>context</code>.
- * If <code>onlyDartDoc</code> is <code>true</code> then only
- * DartDoc comments will be recorded, otherwise all comments will be recorded.
- */
- public CommentPreservingParser(ParserContext context,
- boolean onlyDartDoc) {
- super(context, onlyDartDoc);
- this.context = (CommentParserContext) context;
- this.onlyDartDoc = onlyDartDoc;
- }
-
- @Override
- public DartUnit parseUnit(DartSource input) {
- DartUnit unit = super.parseUnit(input);
-
- String sourceString = context.source;
- Source source = new DartSourceString(null, sourceString);
-
- for (int[] loc : context.getCommentLocs()) {
- DartComment.Style style = getCommentStyle(sourceString, loc[0]);
- if (!onlyDartDoc || style == DartComment.Style.DART_DOC) {
- unit.getComments().add(new DartComment(source, loc[0], loc[1] - loc[0], loc[2], loc[3], style));
- }
- }
-
- List<DartComment> comments = unit.getComments();
-
- if (comments != null) {
- assignDartComments(unit, comments);
- }
-
- return unit;
- }
-
- private void assignDartComments(DartUnit unit, List<DartComment> comments) {
- // Collect the AST nodes in a list.
- final List<DartNode> astNodes = new ArrayList<DartNode>();
- unit.accept(new ASTVisitor<DartNode>() {
- @Override
- public DartNode visitDeclaration(DartDeclaration<?> node) {
- astNodes.add(node);
- return super.visitNode(node);
- }
- });
-
- // Collect all the nodes in one list.
- List<DartNode> nodes = new ArrayList<DartNode>();
-
- nodes.addAll(comments);
- nodes.addAll(astNodes);
-
- // Sort the nodes by their position in the source file.
- Collections.sort(nodes, new Comparator<DartNode>() {
- @Override
- public int compare(DartNode node1, DartNode node2) {
- return node1.getSourceInfo().getOffset() - node2.getSourceInfo().getOffset();
- }
- });
-
- // Assign dart docs to their associated DartDeclarations.
- for (int i = 0; i < nodes.size(); i++) {
- DartNode node = nodes.get(i);
-
- if (node instanceof DartComment) {
- DartComment comment = (DartComment)node;
-
- if (comment.isDartDoc() && (i + 1 < nodes.size())) {
- DartNode next = nodes.get(i + 1);
-
- if (next instanceof DartDeclaration) {
- DartDeclaration<?> decl = (DartDeclaration<?>)next;
-
- if (!commentContainedBySibling(comment, decl)) {
- // Dartc creates both a DartField and a DartMethodDefinition for getters and setters.
- // They have the same source location; we want to assign the dartdoc to the method
- // definition and not the field.
- if (i + 2 < nodes.size()) {
- decl = adjustDartdocTarget(next, nodes.get(i + 2));
- }
-
- decl.setDartDoc(comment);
- }
- }
- }
- }
- }
- }
-
- private DartDeclaration<?> adjustDartdocTarget(DartNode currentNode, DartNode nextNode) {
- if (currentNode instanceof DartField && nextNode instanceof DartMethodDefinition) {
- if (currentNode.getSourceInfo().equals(nextNode.getSourceInfo())) {
- return (DartDeclaration<?>)nextNode;
- }
- }
-
- return (DartDeclaration<?>)currentNode;
- }
-
- private boolean commentContainedBySibling(DartComment comment, DartDeclaration<?> node) {
- for (DartNode child : getChildren(node.getParent())) {
- if (child != node && !(child instanceof DartComment)) {
- if (isContainedBy(comment, child)) {
- return true;
- }
- }
- }
-
- return false;
- }
-
- private List<DartNode> getChildren(DartNode parent) {
- final List<DartNode> children = new ArrayList<DartNode>();
-
- parent.visitChildren(new ASTVisitor<DartNode>() {
- @Override
- public DartNode visitNode(DartNode node) {
- children.add(node);
- return null;
- }
- });
-
- return children;
- }
-
- private static boolean isContainedBy(DartNode node, DartNode containedByNode) {
- SourceInfo nodeSource = node.getSourceInfo();
- SourceInfo containedBySource = containedByNode.getSourceInfo();
- int nodeEnd = nodeSource.getOffset() + nodeSource.getLength();
- int containedByEnd = containedBySource.getOffset() + containedBySource.getLength();
- return nodeSource.getOffset() >= containedBySource.getOffset()
- && nodeEnd <= containedByEnd;
- }
-
- /**
- * Return the style of the comment in the given string.
- *
- * @param sourceString the source containing the comment
- * @param commentStart the location of the comment in the source
- *
- * @return the style of the comment in the given string
- */
- private DartComment.Style getCommentStyle(String sourceString, int commentStart) {
- if (sourceString.charAt(commentStart + 1) == '/') {
- return DartComment.Style.END_OF_LINE;
- } else if (sourceString.charAt(commentStart + 2) == '*') {
- return DartComment.Style.DART_DOC;
- }
- return DartComment.Style.BLOCK;
- }
-}

Powered by Google App Engine
This is Rietveld 408576698