blob: 0eab7e9f7c1ff45e06f755d9346a1d9dd82e77dd [file] [log] [blame]
package org.eclipse.ajdt.core.codeconversion;
import java.lang.reflect.Field;
import org.eclipse.ajdt.core.AspectJCore;
import org.eclipse.ajdt.core.javaelements.AJCompilationUnit;
import org.eclipse.ajdt.core.javaelements.AspectElement;
import org.eclipse.ajdt.core.javaelements.ITDAwareSourceTypeInfo;
import org.eclipse.ajdt.core.javaelements.NotImplementedException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jdt.core.IPackageFragment;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.core.WorkingCopyOwner;
import org.eclipse.jdt.internal.codeassist.ISearchRequestor;
import org.eclipse.jdt.internal.compiler.env.AccessRestriction;
import org.eclipse.jdt.internal.compiler.env.IBinaryType;
import org.eclipse.jdt.internal.compiler.env.ICompilationUnit;
import org.eclipse.jdt.internal.compiler.env.ISourceType;
import org.eclipse.jdt.internal.compiler.env.NameEnvironmentAnswer;
import org.eclipse.jdt.internal.core.BinaryType;
import org.eclipse.jdt.internal.core.CancelableNameEnvironment;
import org.eclipse.jdt.internal.core.JavaElement;
import org.eclipse.jdt.internal.core.JavaProject;
import org.eclipse.jdt.internal.core.NameLookup;
import org.eclipse.jdt.internal.core.SourceType;
import org.eclipse.jdt.internal.core.SourceTypeElementInfo;
public class ITDAwareCancelableNameEnvironment extends
CancelableNameEnvironment {
public ITDAwareCancelableNameEnvironment(JavaProject project,
WorkingCopyOwner owner, IProgressMonitor monitor)
throws JavaModelException {
super(project, owner, monitor);
}
protected NameEnvironmentAnswer find(String typeName, String packageName) {
if (packageName == null)
packageName = IPackageFragment.DEFAULT_PACKAGE_NAME;
NameLookup.Answer answer =
this.nameLookup.findType(
typeName,
packageName,
false/*exact match*/,
NameLookup.ACCEPT_ALL,
this.checkAccessRestrictions);
if (answer != null) {
// construct name env answer
if (answer.type instanceof BinaryType) { // BinaryType
try {
return new NameEnvironmentAnswer((IBinaryType) ((BinaryType) answer.type).getElementInfo(), getRestriction(answer));
} catch (JavaModelException npe) {
return null;
}
} else { // SourceType
try {
SourceType sourceType = (SourceType) answer.type;
SourceTypeElementInfo sourceTypeInfo;
IType[] types;
try {
// retrieve the requested type
sourceTypeInfo = (SourceTypeElementInfo) sourceType.getElementInfo();
// find all siblings (other types declared in same unit, since may be used for name resolution)
types = sourceTypeInfo.getHandle().getCompilationUnit().getTypes();
} catch (JavaModelException e) {
// this might be an AspectElement
// convert to an aspect element handle
// and then try to recreate
// XXX this will only work if the type is a top-level aspect
// OK for now.
String ajHandle = sourceType.getHandleIdentifier();
sourceType = ((SourceType) AspectJCore.create(
AspectJCore.convertToAspectHandle(ajHandle, sourceType)));
sourceTypeInfo = (SourceTypeElementInfo) sourceType.getElementInfo();
types = ((AJCompilationUnit) sourceType.getParent()).getTypes();
}
ISourceType topLevelType = sourceTypeInfo;
while (topLevelType.getEnclosingType() != null) {
topLevelType = topLevelType.getEnclosingType();
}
ISourceType[] sourceTypes = new ISourceType[types.length];
// in the resulting collection, ensure the requested type is the first one
ITDAwareSourceTypeInfo newInfo = new ITDAwareSourceTypeInfo(sourceTypeInfo, sourceType); // AspectJ Change
sourceTypes[0] = newInfo;
int length = types.length;
for (int i = 0, index = 1; i < length; i++) {
ISourceType otherType =
(ISourceType) ((JavaElement) types[i]).getElementInfo();
if (!otherType.equals(topLevelType) && index < length) { // check that the index is in bounds (see https://bugs.eclipse.org/bugs/show_bug.cgi?id=62861)
ITDAwareSourceTypeInfo newOtherInfo =
new ITDAwareSourceTypeInfo(otherType, (SourceType) types[i]); // AspectJ Change
sourceTypes[index++] = newOtherInfo; // AspectJ Change
}
}
return new NameEnvironmentAnswer(sourceTypes, getRestriction(answer));
} catch (JavaModelException npe) {
return null;
}
}
}
return null;
}
public NameEnvironmentAnswer findType(char[] name, char[][] packageName) {
return super.findType(name, packageName);
}
public NameEnvironmentAnswer findType(char[][] compoundTypeName) {
return super.findType(compoundTypeName);
}
public void findTypes(char[] prefix, boolean findMembers,
boolean camelCaseMatch, int searchFor, ISearchRequestor storage) {
super.findTypes(prefix, findMembers, camelCaseMatch, searchFor, storage);
// throw new NotImplementedException();
}
public void findExactTypes(char[] name, boolean findMembers, int searchFor,
ISearchRequestor storage) {
// super.findExactTypes(name, findMembers, searchFor, storage);
throw new NotImplementedException();
}
private static Field restrictionField;
private AccessRestriction getRestriction(NameLookup.Answer answer) {
try {
if (restrictionField == null) {
restrictionField = NameLookup.Answer.class.getDeclaredField("restriction");
restrictionField.setAccessible(true);
}
return (AccessRestriction) restrictionField.get(answer);
} catch (IllegalArgumentException e) {
} catch (IllegalAccessException e) {
} catch (SecurityException e) {
} catch (NoSuchFieldException e) {
}
return null;
}
public void setUnitToSkip(ICompilationUnit unit) {
this.unitToSkip = unit;
}
}