Package com.google.dart.engine.internal.html.angular

Source Code of com.google.dart.engine.internal.html.angular.AngularDartIndexContributor

/*
* Copyright (c) 2014, the Dart project authors.
*
* Licensed under the Eclipse Public License v1.0 (the "License"); you may not use this file except
* in compliance with the License. You may obtain a copy of the License at
*
* http://www.eclipse.org/legal/epl-v10.html
*
* Unless required by applicable law or agreed to in writing, software distributed under the License
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
* or implied. See the License for the specific language governing permissions and limitations under
* the License.
*/

package com.google.dart.engine.internal.html.angular;

import com.google.dart.engine.ast.ClassDeclaration;
import com.google.dart.engine.ast.CompilationUnit;
import com.google.dart.engine.ast.CompilationUnitMember;
import com.google.dart.engine.ast.visitor.GeneralizingAstVisitor;
import com.google.dart.engine.element.ClassElement;
import com.google.dart.engine.element.FieldElement;
import com.google.dart.engine.element.PropertyAccessorElement;
import com.google.dart.engine.element.ToolkitObjectElement;
import com.google.dart.engine.element.angular.AngularComponentElement;
import com.google.dart.engine.element.angular.AngularDecoratorElement;
import com.google.dart.engine.element.angular.AngularPropertyElement;
import com.google.dart.engine.index.IndexStore;
import com.google.dart.engine.index.Location;
import com.google.dart.engine.internal.index.IndexConstants;

/**
* Visits resolved {@link CompilationUnit} and adds Angular specific relationships into
* {@link IndexStore}.
*
* @coverage dart.engine.index
*/
public class AngularDartIndexContributor extends GeneralizingAstVisitor<Void> {
  private final IndexStore store;

  public AngularDartIndexContributor(IndexStore store) {
    this.store = store;
  }

  @Override
  public Void visitClassDeclaration(ClassDeclaration node) {
    ClassElement classElement = node.getElement();
    if (classElement != null) {
      ToolkitObjectElement[] toolkitObjects = classElement.getToolkitObjects();
      for (ToolkitObjectElement object : toolkitObjects) {
        if (object instanceof AngularComponentElement) {
          indexComponent((AngularComponentElement) object);
        }
        if (object instanceof AngularDecoratorElement) {
          AngularDecoratorElement directive = (AngularDecoratorElement) object;
          indexDirective(directive);
        }
      }
    }
    // stop visiting
    return null;
  }

  @Override
  public Void visitCompilationUnitMember(CompilationUnitMember node) {
    // stop visiting
    return null;
  }

  private void indexComponent(AngularComponentElement component) {
    indexProperties(component.getProperties());
  }

  private void indexDirective(AngularDecoratorElement directive) {
    indexProperties(directive.getProperties());
  }

  /**
   * Index {@link FieldElement} references from {@link AngularPropertyElement}s.
   */
  private void indexProperties(AngularPropertyElement[] properties) {
    for (AngularPropertyElement property : properties) {
      FieldElement field = property.getField();
      if (field != null) {
        int offset = property.getFieldNameOffset();
        if (offset == -1) {
          continue;
        }
        int length = field.getName().length();
        Location location = new Location(property, offset, length);
        // getter reference
        if (property.getPropertyKind().callsGetter()) {
          PropertyAccessorElement getter = field.getGetter();
          if (getter != null) {
            store.recordRelationship(getter, IndexConstants.IS_REFERENCED_BY_QUALIFIED, location);
          }
        }
        // setter reference
        if (property.getPropertyKind().callsSetter()) {
          PropertyAccessorElement setter = field.getSetter();
          if (setter != null) {
            store.recordRelationship(setter, IndexConstants.IS_REFERENCED_BY_QUALIFIED, location);
          }
        }
      }
    }
  }
}
TOP

Related Classes of com.google.dart.engine.internal.html.angular.AngularDartIndexContributor

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.