| Index: dart/compiler/java/com/google/dart/compiler/parser/DartParserCommentsHelper.java
|
| diff --git a/dart/compiler/java/com/google/dart/compiler/parser/DartParserCommentsHelper.java b/dart/compiler/java/com/google/dart/compiler/parser/DartParserCommentsHelper.java
|
| deleted file mode 100644
|
| index 46654c3a76a7c9fa8f8cfefa5db8ccfa00577418..0000000000000000000000000000000000000000
|
| --- a/dart/compiler/java/com/google/dart/compiler/parser/DartParserCommentsHelper.java
|
| +++ /dev/null
|
| @@ -1,289 +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.common.collect.Lists;
|
| -import com.google.dart.compiler.DartCompilerListener;
|
| -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.DartCommentNewName;
|
| -import com.google.dart.compiler.ast.DartCommentRefName;
|
| -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.apache.StringUtils;
|
| -
|
| -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 DartParserCommentsHelper {
|
| -
|
| - static class CommentParserContext extends DartScannerParserContext {
|
| -
|
| - private List<int[]> commentLocs;
|
| -
|
| - CommentParserContext(Source source, String code, DartCompilerListener listener,
|
| - CompilerMetrics metrics) {
|
| - super(source, code, listener, metrics);
|
| - }
|
| -
|
| - List<int[]> getCommentLocs() {
|
| - return commentLocs;
|
| - }
|
| -
|
| - @Override
|
| - protected DartScanner createScanner(String sourceCode, Source source,
|
| - DartCompilerListener listener) {
|
| - commentLocs = Lists.newArrayList();
|
| - return new CommentScanner(sourceCode, 0, source, listener);
|
| - }
|
| -
|
| - private class CommentScanner extends DartScanner {
|
| -
|
| - CommentScanner(String sourceCode, int start, Source sourceReference,
|
| - DartCompilerListener listener) {
|
| - super(sourceCode, start, sourceReference, listener);
|
| - }
|
| -
|
| - @Override
|
| - protected void recordCommentLocation(int start, int stop) {
|
| - 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});
|
| - }
|
| - }
|
| - }
|
| -
|
| - static void addComments(DartUnit unit, Source source, String sourceCode, List<int[]> commentLocs) {
|
| - for (int[] loc : commentLocs) {
|
| - int start = loc[0];
|
| - int length = loc[1] - start;
|
| - DartComment.Style style = getCommentStyle(sourceCode, start);
|
| - unit.getComments().add(new DartComment(source, start, length, style));
|
| - }
|
| - List<DartComment> comments = unit.getComments();
|
| - if (comments != null) {
|
| - assignDartComments(unit, sourceCode, comments);
|
| - }
|
| - }
|
| -
|
| - private static void assignDartComments(DartUnit unit, String sourceCode,
|
| - 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);
|
| - // Avoid NPE in visitors because of missing part.
|
| - try {
|
| - super.visitDeclaration(node);
|
| - } catch (NullPointerException e) {
|
| - }
|
| - // No result.
|
| - return null;
|
| - }
|
| - });
|
| -
|
| - // 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;
|
| - // prepare next declaration
|
| - DartDeclaration<?> decl = null;
|
| - {
|
| - int delta = 1;
|
| - while (i + delta < nodes.size()) {
|
| - DartNode next = nodes.get(i + delta);
|
| - // skip all comments
|
| - if (next instanceof DartComment) {
|
| - delta++;
|
| - continue;
|
| - }
|
| - // declaration found
|
| - if (next instanceof DartDeclaration) {
|
| - decl = (DartDeclaration<?>) next;
|
| - if (!commentContainedBySibling(comment, decl)) {
|
| - if (i + 2 < nodes.size()) {
|
| - decl = adjustDartdocTarget(next, nodes.get(i + 2));
|
| - }
|
| - }
|
| - break;
|
| - }
|
| - // something other than declaration
|
| - break;
|
| - }
|
| - }
|
| - // apply comment to declaration
|
| - if (decl != null) {
|
| - String commentStr = sourceCode.substring(comment.getSourceInfo().getOffset(),
|
| - comment.getSourceInfo().getEnd());
|
| - tokenizeComment(comment, commentStr);
|
| - // DartDoc
|
| - if (comment.isDartDoc()) {
|
| - decl.setDartDoc(comment);
|
| - }
|
| - }
|
| - }
|
| - }
|
| - }
|
| -
|
| - private static void tokenizeComment(DartComment comment, String src) {
|
| - int lastIndex = 0;
|
| - while (true) {
|
| - int openIndex = src.indexOf('[', lastIndex);
|
| - if (openIndex == -1) {
|
| - break;
|
| - }
|
| - int closeIndex = src.indexOf(']', openIndex);
|
| - if (closeIndex == -1) {
|
| - break;
|
| - }
|
| - lastIndex = closeIndex;
|
| - String tokenSrc = src.substring(openIndex + 1, closeIndex);
|
| - if (tokenSrc.startsWith(":") && tokenSrc.endsWith(":")) {
|
| - // TODO(scheglov) [:code:] and 'code'
|
| - } else if (tokenSrc.startsWith("new ")) {
|
| - SourceInfo sourceInfo = comment.getSourceInfo();
|
| - int offset = sourceInfo.getOffset() + openIndex;
|
| - int classOffset = offset + "[".length();
|
| - // remove leading "new "
|
| - String name = StringUtils.remove(tokenSrc, "new ");
|
| - classOffset += "new ".length();
|
| - // remove spaces
|
| - {
|
| - String stripName = StringUtils.stripStart(name, null);
|
| - classOffset += name.length() - stripName.length();
|
| - name = stripName;
|
| - }
|
| - name = name.trim();
|
| - //
|
| - String className = StringUtils.substringBefore(name, ".");
|
| - String constructorName = StringUtils.substringAfter(name, ".");
|
| - int constructorOffset = classOffset + className.length() + ".".length();
|
| - DartCommentNewName newNode = new DartCommentNewName(className, classOffset,
|
| - constructorName, constructorOffset);
|
| - {
|
| - Source source = sourceInfo.getSource();
|
| - int length = tokenSrc.length() + "[]".length();
|
| - newNode.setSourceInfo(new SourceInfo(source, offset, length));
|
| - }
|
| - // add node
|
| - comment.addNewName(newNode);
|
| - } else {
|
| - String name = tokenSrc.trim();
|
| - DartCommentRefName refNode = new DartCommentRefName(name);
|
| - {
|
| - SourceInfo sourceInfo = comment.getSourceInfo();
|
| - Source source = sourceInfo.getSource();
|
| - int offset = sourceInfo.getOffset() + openIndex;
|
| - int length = name.length() + "[]".length();
|
| - refNode.setSourceInfo(new SourceInfo(source, offset, length));
|
| - }
|
| - comment.addRefName(refNode);
|
| - }
|
| - }
|
| - }
|
| -
|
| - private static 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;
|
| - }
|
| -
|
| - /**
|
| - * DartC creates both a {@link DartField} and a {@link 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.
|
| - */
|
| - private static boolean commentContainedBySibling(DartComment comment, DartDeclaration<?> node) {
|
| - if (node instanceof DartField) {
|
| - for (DartNode child : getChildren(node.getParent())) {
|
| - if (child != node && !(child instanceof DartComment)) {
|
| - if (isContainedBy(comment, child)) {
|
| - return true;
|
| - }
|
| - }
|
| - }
|
| - }
|
| - return false;
|
| - }
|
| -
|
| - private static 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 static DartComment.Style getCommentStyle(String sourceString, int commentStart) {
|
| - boolean hasMore1 = commentStart + 1 < sourceString.length();
|
| - boolean hasMore2 = commentStart + 2 < sourceString.length();
|
| - if (hasMore1 && sourceString.charAt(commentStart + 1) == '/') {
|
| - return DartComment.Style.END_OF_LINE;
|
| - } else if (hasMore2 && sourceString.charAt(commentStart + 2) == '*') {
|
| - return DartComment.Style.DART_DOC;
|
| - }
|
| - return DartComment.Style.BLOCK;
|
| - }
|
| -}
|
|
|