Chromium Code Reviews| Index: pkg/analysis_server/lib/src/services/correction/util.dart |
| diff --git a/pkg/analysis_server/lib/src/services/correction/util.dart b/pkg/analysis_server/lib/src/services/correction/util.dart |
| index 4b56971ed50047650fb8e12c387a8d0080ab7390..31878b3b573c1506972b3dd883883210eb04e848 100644 |
| --- a/pkg/analysis_server/lib/src/services/correction/util.dart |
| +++ b/pkg/analysis_server/lib/src/services/correction/util.dart |
| @@ -94,6 +94,21 @@ String getElementQualifiedName(Element element) { |
| /** |
| + * If the given [AstNode] is in a [ClassDeclaration], returns the |
| + * [ClassElement]. Otherwise returns `null`. |
| + */ |
| +ClassElement getEnclosingClassElement(AstNode node) { |
| + ClassDeclaration enclosingClassNode = |
| + node.getAncestor((node) => node is ClassDeclaration); |
| + if (enclosingClassNode != null) { |
| + return enclosingClassNode.element; |
| + } |
| + return null; |
| +} |
| + |
| + |
| + |
| +/** |
| * Returns a class or an unit member enclosing the given [node]. |
| */ |
| AstNode getEnclosingClassOrUnitMember(AstNode node) { |
| @@ -111,8 +126,6 @@ AstNode getEnclosingClassOrUnitMember(AstNode node) { |
| return null; |
| } |
| - |
| - |
| /** |
| * @return the [ExecutableElement] of the enclosing executable [AstNode]. |
| */ |
| @@ -132,6 +145,7 @@ ExecutableElement getEnclosingExecutableElement(AstNode node) { |
| return null; |
| } |
| + |
| /** |
| * @return the enclosing executable [AstNode]. |
| */ |
| @@ -178,6 +192,7 @@ int getExpressionPrecedence(AstNode node) { |
| } |
| + |
| /** |
| * Returns the namespace of the given [ImportElement]. |
| */ |
| @@ -188,6 +203,22 @@ Map<String, Element> getImportNamespace(ImportElement imp) { |
| } |
| +/** |
| + * Returns the line prefix from the given source, i.e. basically just a |
| + * whitespace prefix of the given [String]. |
| + */ |
| +String getLinesPrefix(String lines) { |
|
Brian Wilkerson
2014/08/31 15:59:56
Should "lines" be "line"?
scheglov
2014/08/31 16:43:23
Acknowledged.
|
| + int index = 0; |
| + while (index < lines.length) { |
| + int c = lines.codeUnitAt(index); |
| + if (!isWhitespace(c)) { |
| + break; |
| + } |
| + index++; |
| + } |
| + return lines.substring(0, index); |
| +} |
| + |
| /** |
| * @return the [LocalVariableElement] or [ParameterElement] if given |
| @@ -218,7 +249,6 @@ LocalVariableElement getLocalVariableElement(SimpleIdentifier node) { |
| return null; |
| } |
| - |
| /** |
| * @return the nearest common ancestor [AstNode] of the given [AstNode]s. |
| */ |
| @@ -247,6 +277,40 @@ AstNode getNearestCommonAncestor(List<AstNode> nodes) { |
| return parents[0][i - 1]; |
| } |
| +/** |
| + * Returns the [Expression] qualifier if given node is the name part of a |
| + * [PropertyAccess] or a [PrefixedIdentifier]. Maybe `null`. |
| + */ |
| +Expression getNodeQualifier(SimpleIdentifier node) { |
| + AstNode parent = node.parent; |
| + if (parent is PropertyAccess) { |
| + PropertyAccess propertyAccess = parent; |
| + if (identical(propertyAccess.propertyName, node)) { |
| + return propertyAccess.target; |
| + } |
| + } |
| + if (parent is PrefixedIdentifier) { |
| + PrefixedIdentifier prefixed = parent; |
| + if (identical(prefixed.identifier, node)) { |
| + return prefixed.prefix; |
| + } |
| + } |
| + return null; |
| +} |
| + |
| + |
| +/** |
| + * Returns the [ParameterElement] if the given [SimpleIdentifier] is a reference |
| + * to a parameter, or `null` in the other case. |
| + */ |
| +ParameterElement getParameterElement(SimpleIdentifier node) { |
| + Element element = node.staticElement; |
| + if (element is ParameterElement) { |
| + return element; |
| + } |
| + return null; |
| +} |
| + |
| /** |
| * @return parent [AstNode]s from [CompilationUnit] (at index "0") to the given one. |
| @@ -272,6 +336,20 @@ List<AstNode> getParents(AstNode node) { |
| return parents; |
| } |
| + |
| +/** |
| + * Returns a [PropertyAccessorElement] if the given [SimpleIdentifier] is a |
| + * reference to a property, or `null` in the other case. |
| + */ |
| +PropertyAccessorElement getPropertyAccessorElement(SimpleIdentifier node) { |
| + Element element = node.staticElement; |
| + if (element is PropertyAccessorElement) { |
| + return element; |
| + } |
| + return null; |
| +} |
| + |
| + |
| /** |
| * If given [AstNode] is name of qualified property extraction, returns target from which |
| * this property is extracted. Otherwise `null`. |
| @@ -293,6 +371,7 @@ Expression getQualifiedPropertyTarget(AstNode node) { |
| return null; |
| } |
| + |
| /** |
| * Returns the given [Statement] if not a [Block], or the first child |
| * [Statement] if a [Block], or `null` if more than one child. |
| @@ -339,6 +418,16 @@ bool hasDisplayName(Element element, String name) { |
| return element.displayName == name; |
| } |
| +/** |
| + * Returns `true` if the given [PropertyAccessorElement] is an accessor of |
| + * some [FieldElement]. |
| + */ |
| +bool isFieldAccessorElement(PropertyAccessorElement accessor) { |
| + return accessor != null && |
| + accessor.variable is FieldElement && |
| + accessor.variable.enclosingElement is ClassElement; |
|
Brian Wilkerson
2014/08/31 15:59:56
Do we have field elements whose parent is not a cl
scheglov
2014/08/31 16:43:23
Yes, we do.
Although we are not interested in it f
|
| +} |
| + |
| /** |
| * @return <code>true</code> if given [DartNode] is left hand side of assignment, or |
| @@ -413,7 +502,8 @@ class CorrectionUtils { |
| /** |
| * Returns the [AstNode] that encloses the given offset. |
| */ |
| - AstNode findNode(int offset) => new NodeLocator.con1(offset).searchWithin(unit); |
| + AstNode findNode(int offset) => |
| + new NodeLocator.con1(offset).searchWithin(unit); |
| /** |
| * Returns the actual type source of the given [Expression], may be `null` |
| @@ -1226,6 +1316,7 @@ class TokenUtils { |
| tokens.length == 1 && tokens[0].type == type; |
| } |
| + |
| /** |
| * A container with a source and its precedence. |
| */ |