Package org.eclipse.jdt.internal.codeassist

Source Code of org.eclipse.jdt.internal.codeassist.CompletionUnitStructureRequestor

/*******************************************************************************
* Copyright (c) 2008, 2009 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
*     IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.jdt.internal.codeassist;

import java.util.Map;

import org.eclipse.jdt.core.IAnnotation;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IMemberValuePair;
import org.eclipse.jdt.internal.codeassist.complete.CompletionOnMarkerAnnotationName;
import org.eclipse.jdt.internal.codeassist.complete.CompletionOnMemberValueName;
import org.eclipse.jdt.internal.codeassist.complete.CompletionOnParameterizedQualifiedTypeReference;
import org.eclipse.jdt.internal.codeassist.complete.CompletionOnQualifiedNameReference;
import org.eclipse.jdt.internal.codeassist.complete.CompletionOnQualifiedTypeReference;
import org.eclipse.jdt.internal.codeassist.complete.CompletionOnSingleNameReference;
import org.eclipse.jdt.internal.codeassist.complete.CompletionOnSingleTypeReference;
import org.eclipse.jdt.internal.codeassist.impl.AssistAnnotation;
import org.eclipse.jdt.internal.codeassist.impl.AssistImportContainer;
import org.eclipse.jdt.internal.codeassist.impl.AssistImportDeclaration;
import org.eclipse.jdt.internal.codeassist.impl.AssistInitializer;
import org.eclipse.jdt.internal.codeassist.impl.AssistPackageDeclaration;
import org.eclipse.jdt.internal.codeassist.impl.AssistSourceField;
import org.eclipse.jdt.internal.codeassist.impl.AssistSourceMethod;
import org.eclipse.jdt.internal.codeassist.impl.AssistSourceType;
import org.eclipse.jdt.internal.codeassist.impl.AssistTypeParameter;
import org.eclipse.jdt.internal.compiler.ast.ASTNode;
import org.eclipse.jdt.internal.compiler.ast.Expression;
import org.eclipse.jdt.internal.compiler.ast.MemberValuePair;
import org.eclipse.jdt.internal.compiler.ast.ParameterizedQualifiedTypeReference;
import org.eclipse.jdt.internal.compiler.ast.ParameterizedSingleTypeReference;
import org.eclipse.jdt.internal.compiler.ast.TypeReference;
import org.eclipse.jdt.internal.compiler.parser.Parser;
import org.eclipse.jdt.internal.core.AnnotatableInfo;
import org.eclipse.jdt.internal.core.Annotation;
import org.eclipse.jdt.internal.core.CompilationUnit;
import org.eclipse.jdt.internal.core.CompilationUnitElementInfo;
import org.eclipse.jdt.internal.core.CompilationUnitStructureRequestor;
import org.eclipse.jdt.internal.core.ImportContainer;
import org.eclipse.jdt.internal.core.ImportDeclaration;
import org.eclipse.jdt.internal.core.Initializer;
import org.eclipse.jdt.internal.core.JavaElement;
import org.eclipse.jdt.internal.core.JavaModelManager;
import org.eclipse.jdt.internal.core.PackageDeclaration;
import org.eclipse.jdt.internal.core.SourceField;
import org.eclipse.jdt.internal.core.SourceMethod;
import org.eclipse.jdt.internal.core.SourceType;
import org.eclipse.jdt.internal.core.TypeParameter;

public class CompletionUnitStructureRequestor extends CompilationUnitStructureRequestor {
  private ASTNode assistNode;

  private Map bindingCache;
  private Map elementCache;
  private Map elementWithProblemCache;

  public CompletionUnitStructureRequestor(
      ICompilationUnit unit,
      CompilationUnitElementInfo unitInfo,
      Parser parser,
      ASTNode assistNode,
      Map bindingCache,
      Map elementCache,
      Map elementWithProblemCache,
      Map newElements) {
    super(unit, unitInfo, newElements);
    this.parser = parser;
    this.assistNode = assistNode;
    this.bindingCache = bindingCache;
    this.elementCache = elementCache;
    this.elementWithProblemCache = elementWithProblemCache;
  }

  protected Annotation createAnnotation(JavaElement parent, String name) {
    return new AssistAnnotation(parent, name, this.newElements);
  }

  protected SourceField createField(JavaElement parent, FieldInfo fieldInfo) {
    String fieldName = JavaModelManager.getJavaModelManager().intern(new String(fieldInfo.name));
    AssistSourceField field = new AssistSourceField(parent, fieldName, this.bindingCache, this.newElements);
    if (fieldInfo.node.binding != null) {
      this.bindingCache.put(field, fieldInfo.node.binding);
      this.elementCache.put(fieldInfo.node.binding, field);
    } else {
      this.elementWithProblemCache.put(fieldInfo.node, field);
    }
    return field;
  }

  protected ImportContainer createImportContainer(ICompilationUnit parent) {
    return new AssistImportContainer((CompilationUnit)parent, this.newElements);
  }

  protected ImportDeclaration createImportDeclaration(ImportContainer parent, String name, boolean onDemand) {
    return new AssistImportDeclaration(parent, name, onDemand, this.newElements);
  }

  protected Initializer createInitializer(JavaElement parent) {
    return new AssistInitializer(parent, 1, this.bindingCache, this.newElements);
  }

  protected SourceMethod createMethodHandle(JavaElement parent, MethodInfo methodInfo) {
    String selector = JavaModelManager.getJavaModelManager().intern(new String(methodInfo.name));
    String[] parameterTypeSigs = convertTypeNamesToSigs(methodInfo.parameterTypes);
    AssistSourceMethod method = new AssistSourceMethod(parent, selector, parameterTypeSigs, this.bindingCache, this.newElements);
    if (methodInfo.node.binding != null) {
      this.bindingCache.put(method, methodInfo.node.binding);
      this.elementCache.put(methodInfo.node.binding, method);
    } else {
      this.elementWithProblemCache.put(methodInfo.node, method);
    }
    return method;
  }

  protected PackageDeclaration createPackageDeclaration(JavaElement parent, String name) {
    return new AssistPackageDeclaration((CompilationUnit) parent, name, this.newElements);
  }

  protected SourceType createTypeHandle(JavaElement parent, TypeInfo typeInfo) {
    String nameString= new String(typeInfo.name);
    AssistSourceType type = new AssistSourceType(parent, nameString, this.bindingCache, this.newElements);
    if (typeInfo.node.binding != null) {
      this.bindingCache.put(type, typeInfo.node.binding);
      this.elementCache.put(typeInfo.node.binding, type);
    } else {
      this.elementWithProblemCache.put(typeInfo.node, type);
    }
    return type;
  }

  protected TypeParameter createTypeParameter(JavaElement parent, String name) {
    return new AssistTypeParameter(parent, name, this.newElements);
  }

  protected IAnnotation acceptAnnotation(
      org.eclipse.jdt.internal.compiler.ast.Annotation annotation,
      AnnotatableInfo parentInfo,
      JavaElement parentHandle) {
    if (annotation instanceof CompletionOnMarkerAnnotationName) {
      if (hasEmptyName(annotation.type, this.assistNode)) {
        super.acceptAnnotation(annotation, null, parentHandle);
        return null;
      }
    }
    return super.acceptAnnotation(annotation, parentInfo, parentHandle);
  }

  protected Object getMemberValue(
      org.eclipse.jdt.internal.core.MemberValuePair memberValuePair,
      Expression expression) {
    if (expression instanceof CompletionOnSingleNameReference) {
      CompletionOnSingleNameReference reference = (CompletionOnSingleNameReference) expression;
      if (reference.token.length == 0) return null;
    } else if (expression instanceof CompletionOnQualifiedNameReference) {
      CompletionOnQualifiedNameReference reference = (CompletionOnQualifiedNameReference) expression;
      if (reference.tokens[reference.tokens.length - 1].length == 0) return null;
    }
    return super.getMemberValue(memberValuePair, expression);
  }
  protected IMemberValuePair[] getMemberValuePairs(MemberValuePair[] memberValuePairs) {
    int membersLength = memberValuePairs.length;
    int membersCount = 0;
    IMemberValuePair[] members = new IMemberValuePair[membersLength];
    next : for (int j = 0; j < membersLength; j++) {
      if (memberValuePairs[j] instanceof CompletionOnMemberValueName) continue next;

      members[membersCount++] = getMemberValuePair(memberValuePairs[j]);
    }

    if (membersCount > membersLength) {
      System.arraycopy(members, 0, members, 0, membersCount);
    }
    return members;
  }

  protected static boolean hasEmptyName(TypeReference reference, ASTNode assistNode) {
    if (reference == null) return false;

    if (reference.sourceStart <= assistNode.sourceStart && assistNode.sourceEnd <= reference.sourceEnd) return false;

    if (reference instanceof CompletionOnSingleTypeReference ||
        reference instanceof CompletionOnQualifiedTypeReference ||
        reference instanceof CompletionOnParameterizedQualifiedTypeReference) {
      char[][] typeName = reference.getTypeName();
      if (typeName[typeName.length - 1].length == 0) return true;
    }
    if (reference instanceof ParameterizedSingleTypeReference) {
      ParameterizedSingleTypeReference parameterizedReference = (ParameterizedSingleTypeReference) reference;
      TypeReference[] typeArguments = parameterizedReference.typeArguments;
      if (typeArguments != null) {
        for (int i = 0; i < typeArguments.length; i++) {
          if (hasEmptyName(typeArguments[i], assistNode)) return true;
        }
      }
    } else if (reference instanceof ParameterizedQualifiedTypeReference) {
      ParameterizedQualifiedTypeReference parameterizedReference = (ParameterizedQualifiedTypeReference) reference;
      TypeReference[][] typeArguments = parameterizedReference.typeArguments;
      if (typeArguments != null) {
        for (int i = 0; i < typeArguments.length; i++) {
          if (typeArguments[i] != null) {
            for (int j = 0; j < typeArguments[i].length; j++) {
              if (hasEmptyName(typeArguments[i][j], assistNode)) return true;
            }
          }
        }
      }
    }
    return false;
  }
}
TOP

Related Classes of org.eclipse.jdt.internal.codeassist.CompletionUnitStructureRequestor

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.