Services for completion

This commit is contained in:
Andrey Breslav
2011-06-15 19:20:12 +04:00
parent c2fbbff782
commit c10c19b848
18 changed files with 232 additions and 58 deletions
+1 -1
View File
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<project version="4"> <project version="4">
<component name="CompilerConfiguration"> <component name="CompilerConfiguration">
<option name="DEFAULT_COMPILER" value="Javac" /> <option name="DEFAULT_COMPILER" value="Eclipse" />
<resourceExtensions /> <resourceExtensions />
<wildcardResourcePatterns> <wildcardResourcePatterns>
<entry name="?*.properties" /> <entry name="?*.properties" />
@@ -213,7 +213,10 @@ public class MutableClassDescriptor extends MutableDeclarationDescriptor impleme
@NotNull @NotNull
@Override @Override
public ClassDescriptor substitute(TypeSubstitutor substitutor) { public ClassDescriptor substitute(TypeSubstitutor substitutor) {
throw new UnsupportedOperationException(); // TODO if (substitutor.isEmpty()) {
return this;
}
return new LazySubstitutingClassDescriptor(this, substitutor);
} }
@Override @Override
@@ -1,6 +1,8 @@
package org.jetbrains.jet.lang.psi; package org.jetbrains.jet.lang.psi;
import com.google.common.collect.Lists;
import com.intellij.codeInsight.lookup.LookupElement; import com.intellij.codeInsight.lookup.LookupElement;
import com.intellij.codeInsight.lookup.LookupElementPresentation;
import com.intellij.lang.ASTNode; import com.intellij.lang.ASTNode;
import com.intellij.openapi.util.TextRange; import com.intellij.openapi.util.TextRange;
import com.intellij.psi.PsiElement; import com.intellij.psi.PsiElement;
@@ -15,6 +17,9 @@ import org.jetbrains.jet.lang.resolve.AnalyzingUtils;
import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.lang.types.JetType; import org.jetbrains.jet.lang.types.JetType;
import org.jetbrains.jet.lexer.JetTokens; import org.jetbrains.jet.lexer.JetTokens;
import org.jetbrains.jet.resolve.DescriptorRenderer;
import java.util.List;
/** /**
* @author max * @author max
@@ -84,15 +89,25 @@ public class JetSimpleNameExpression extends JetReferenceExpression {
BindingContext bindingContext = AnalyzingUtils.analyzeFileWithCache(file); BindingContext bindingContext = AnalyzingUtils.analyzeFileWithCache(file);
final JetType expressionType = bindingContext.getExpressionType(receiverExpression); final JetType expressionType = bindingContext.getExpressionType(receiverExpression);
if (expressionType != null) { if (expressionType != null) {
return new Object[] { List<LookupElement> result = Lists.newArrayList();
new LookupElement() { for (final DeclarationDescriptor descriptor : expressionType.getMemberScope().getAllDescriptors()) {
@NotNull result.add(
@Override new LookupElement() {
public String getLookupString() { @NotNull
return expressionType.toString(); @Override
public String getLookupString() {
return descriptor.getName();
}
@Override
public void renderElement(LookupElementPresentation presentation) {
presentation.setItemText(descriptor.getName());
presentation.setTypeText(DescriptorRenderer.TEXT.render(descriptor));
}
} }
} );
}; }
return result.toArray();
} }
} }
@@ -61,4 +61,9 @@ public abstract class AbstractScopeAdapter implements JetScope {
public DeclarationDescriptor getDeclarationDescriptorForUnqualifiedThis() { public DeclarationDescriptor getDeclarationDescriptorForUnqualifiedThis() {
return getWorkerScope().getDeclarationDescriptorForUnqualifiedThis(); return getWorkerScope().getDeclarationDescriptorForUnqualifiedThis();
} }
@Override
public Collection<DeclarationDescriptor> getAllDescriptors() {
return getWorkerScope().getAllDescriptors();
}
} }
@@ -46,5 +46,8 @@ public interface BindingContext {
@Nullable @Nullable
JetType getAutoCastType(@NotNull JetExpression expression); JetType getAutoCastType(@NotNull JetExpression expression);
@Nullable
JetScope getResolutionScope(@NotNull JetExpression expression);
Collection<JetDiagnostic> getDiagnostics(); Collection<JetDiagnostic> getDiagnostics();
} }
@@ -29,6 +29,8 @@ public interface BindingTrace {
void recordStatement(@NotNull JetElement statement); void recordStatement(@NotNull JetElement statement);
void recordResolutionScope(@NotNull JetExpression expression, @NotNull JetScope scope);
void removeStatementRecord(@NotNull JetElement statement); void removeStatementRecord(@NotNull JetElement statement);
void removeReferenceResolution(@NotNull JetReferenceExpression referenceExpression); void removeReferenceResolution(@NotNull JetReferenceExpression referenceExpression);
@@ -91,4 +91,9 @@ public class BindingTraceAdapter implements BindingTrace {
public BindingContext getBindingContext() { public BindingContext getBindingContext() {
return originalTrace.getBindingContext(); return originalTrace.getBindingContext();
} }
@Override
public void recordResolutionScope(@NotNull JetExpression expression, @NotNull JetScope scope) {
originalTrace.recordResolutionScope(expression, scope);
}
} }
@@ -36,6 +36,7 @@ public class BindingTraceContext implements BindingContext, BindingTrace {
private final List<JetDiagnostic> diagnostics = Lists.newArrayList(); private final List<JetDiagnostic> diagnostics = Lists.newArrayList();
private final ErrorHandlerWithRegions errorHandler = new ErrorHandlerWithRegions(new CollectingErrorHandler(diagnostics)); private final ErrorHandlerWithRegions errorHandler = new ErrorHandlerWithRegions(new CollectingErrorHandler(diagnostics));
private Map<JetExpression, JetScope> resolutionScopes = Maps.newHashMap();
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -124,6 +125,11 @@ public class BindingTraceContext implements BindingContext, BindingTrace {
statements.add(statement); statements.add(statement);
} }
@Override
public void recordResolutionScope(@NotNull JetExpression expression, @NotNull JetScope scope) {
safePut(resolutionScopes, expression, scope);
}
@Override @Override
public void removeStatementRecord(@NotNull JetElement statement) { public void removeStatementRecord(@NotNull JetElement statement) {
statements.remove(statement); statements.remove(statement);
@@ -267,6 +273,11 @@ public class BindingTraceContext implements BindingContext, BindingTrace {
return autoCasts.get(expression); return autoCasts.get(expression);
} }
@Override
public JetScope getResolutionScope(@NotNull JetExpression expression) {
return resolutionScopes.get(expression);
}
@Override @Override
public Collection<JetDiagnostic> getDiagnostics() { public Collection<JetDiagnostic> getDiagnostics() {
return diagnostics; return diagnostics;
@@ -1,5 +1,6 @@
package org.jetbrains.jet.lang.resolve; package org.jetbrains.jet.lang.resolve;
import com.google.common.collect.Sets;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.types.JetType; import org.jetbrains.jet.lang.types.JetType;
@@ -13,6 +14,7 @@ import java.util.Collections;
public class ChainedScope implements JetScope { public class ChainedScope implements JetScope {
private final DeclarationDescriptor containingDeclaration; private final DeclarationDescriptor containingDeclaration;
private final JetScope[] scopeChain; private final JetScope[] scopeChain;
private Collection<DeclarationDescriptor> allDescriptors;
public ChainedScope(DeclarationDescriptor containingDeclaration, JetScope... scopes) { public ChainedScope(DeclarationDescriptor containingDeclaration, JetScope... scopes) {
this.containingDeclaration = containingDeclaration; this.containingDeclaration = containingDeclaration;
@@ -107,4 +109,15 @@ public class ChainedScope implements JetScope {
} }
return null; return null;
} }
@Override
public Collection<DeclarationDescriptor> getAllDescriptors() {
if (allDescriptors == null) {
allDescriptors = Sets.newHashSet();
for (JetScope scope : scopeChain) {
allDescriptors.addAll(scope.getAllDescriptors());
}
}
return allDescriptors;
}
} }
@@ -54,4 +54,6 @@ public interface JetScope {
@Nullable @Nullable
DeclarationDescriptor getDeclarationDescriptorForUnqualifiedThis(); DeclarationDescriptor getDeclarationDescriptorForUnqualifiedThis();
Collection<DeclarationDescriptor> getAllDescriptors();
} }
@@ -53,4 +53,9 @@ public abstract class JetScopeImpl implements JetScope {
public DeclarationDescriptor getDeclarationDescriptorForUnqualifiedThis() { public DeclarationDescriptor getDeclarationDescriptorForUnqualifiedThis() {
return null; return null;
} }
@Override
public Collection<DeclarationDescriptor> getAllDescriptors() {
return Collections.emptyList();
}
} }
@@ -1,5 +1,6 @@
package org.jetbrains.jet.lang.resolve; package org.jetbrains.jet.lang.resolve;
import com.google.common.collect.Sets;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.descriptors.*;
@@ -15,6 +16,7 @@ public class SubstitutingScope implements JetScope {
private final JetScope workerScope; private final JetScope workerScope;
// private final Map<TypeConstructor, TypeProjection> substitutionContext; // private final Map<TypeConstructor, TypeProjection> substitutionContext;
private final TypeSubstitutor substitutor; private final TypeSubstitutor substitutor;
private Collection<DeclarationDescriptor> allDescriptors;
public SubstitutingScope(JetScope workerScope, @NotNull TypeSubstitutor substitutor) { public SubstitutingScope(JetScope workerScope, @NotNull TypeSubstitutor substitutor) {
this.workerScope = workerScope; this.workerScope = workerScope;
@@ -86,4 +88,15 @@ public class SubstitutingScope implements JetScope {
public DeclarationDescriptor getDeclarationDescriptorForUnqualifiedThis() { public DeclarationDescriptor getDeclarationDescriptorForUnqualifiedThis() {
return workerScope.getDeclarationDescriptorForUnqualifiedThis(); return workerScope.getDeclarationDescriptorForUnqualifiedThis();
} }
@Override
public Collection<DeclarationDescriptor> getAllDescriptors() {
if (allDescriptors == null) {
allDescriptors = Sets.newHashSet();
for (DeclarationDescriptor descriptor : workerScope.getAllDescriptors()) {
allDescriptors.add(descriptor.substitute(substitutor));
}
}
return allDescriptors;
}
} }
@@ -2,6 +2,7 @@ package org.jetbrains.jet.lang.resolve;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.google.common.collect.Maps; import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.ErrorHandler; import org.jetbrains.jet.lang.ErrorHandler;
@@ -15,6 +16,8 @@ import java.util.*;
*/ */
public class WritableScopeImpl extends WritableScopeWithImports { public class WritableScopeImpl extends WritableScopeWithImports {
private final Collection<DeclarationDescriptor> allDescriptors = Sets.newHashSet();
@NotNull @NotNull
private final DeclarationDescriptor ownerDeclarationDescriptor; private final DeclarationDescriptor ownerDeclarationDescriptor;
@@ -51,6 +54,23 @@ public class WritableScopeImpl extends WritableScopeWithImports {
return super.getDeclarationDescriptorForUnqualifiedThis(); return super.getDeclarationDescriptorForUnqualifiedThis();
} }
@Override
public void importScope(@NotNull JetScope imported) {
allDescriptors.addAll(imported.getAllDescriptors());
super.importScope(imported);
}
@Override
public void importClassifierAlias(@NotNull String importedClassifierName, @NotNull ClassifierDescriptor classifierDescriptor) {
allDescriptors.add(classifierDescriptor);
super.importClassifierAlias(importedClassifierName, classifierDescriptor);
}
@Override
public Collection<DeclarationDescriptor> getAllDescriptors() {
return allDescriptors;
}
@NotNull @NotNull
private Map<String, List<DeclarationDescriptor>> getLabelsToDescriptors() { private Map<String, List<DeclarationDescriptor>> getLabelsToDescriptors() {
if (labelsToDescriptors == null) { if (labelsToDescriptors == null) {
@@ -104,6 +124,7 @@ public class WritableScopeImpl extends WritableScopeWithImports {
} }
// TODO : Should this always happen? // TODO : Should this always happen?
variableClassOrNamespaceDescriptors.put(variableDescriptor.getName(), variableDescriptor); variableClassOrNamespaceDescriptors.put(variableDescriptor.getName(), variableDescriptor);
allDescriptors.add(variableDescriptor);
} }
@Override @Override
@@ -140,6 +161,7 @@ public class WritableScopeImpl extends WritableScopeWithImports {
functionGroups.put(name, functionGroup); functionGroups.put(name, functionGroup);
} }
functionGroup.addFunction(functionDescriptor); functionGroup.addFunction(functionDescriptor);
allDescriptors.add(functionDescriptor);
} }
@Override @Override
@@ -202,6 +224,7 @@ public class WritableScopeImpl extends WritableScopeWithImports {
errorHandler.redeclaration(originalDescriptor, classifierDescriptor); errorHandler.redeclaration(originalDescriptor, classifierDescriptor);
} }
variableClassOrNamespaceDescriptors.put(name, classifierDescriptor); variableClassOrNamespaceDescriptors.put(name, classifierDescriptor);
allDescriptors.add(classifierDescriptor);
} }
@Override @Override
@@ -232,6 +255,7 @@ public class WritableScopeImpl extends WritableScopeWithImports {
if (oldValue != null) { if (oldValue != null) {
errorHandler.redeclaration(oldValue, namespaceDescriptor); errorHandler.redeclaration(oldValue, namespaceDescriptor);
} }
allDescriptors.add(namespaceDescriptor);
} }
@Override @Override
@@ -1,14 +1,15 @@
package org.jetbrains.jet.lang.resolve.java; package org.jetbrains.jet.lang.resolve.java;
import com.google.common.collect.Maps; import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
import com.intellij.psi.*; import com.intellij.psi.*;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.resolve.JetScope; import org.jetbrains.jet.lang.resolve.JetScope;
import org.jetbrains.jet.lang.types.*; import org.jetbrains.jet.lang.types.JetType;
import org.jetbrains.jet.lang.types.TypeSubstitutor;
import java.util.Collection; import java.util.Collection;
import java.util.Collections;
import java.util.Map; import java.util.Map;
/** /**
@@ -22,6 +23,7 @@ public class JavaClassMembersScope implements JetScope {
private final Map<String, FunctionGroup> functionGroups = Maps.newHashMap(); private final Map<String, FunctionGroup> functionGroups = Maps.newHashMap();
private final Map<String, VariableDescriptor> variables = Maps.newHashMap(); private final Map<String, VariableDescriptor> variables = Maps.newHashMap();
private final Map<String, ClassifierDescriptor> classifiers = Maps.newHashMap(); private final Map<String, ClassifierDescriptor> classifiers = Maps.newHashMap();
private Collection<DeclarationDescriptor> allDescriptors;
public JavaClassMembersScope(@NotNull DeclarationDescriptor classDescriptor, PsiClass psiClass, JavaSemanticServices semanticServices, boolean staticMembers) { public JavaClassMembersScope(@NotNull DeclarationDescriptor classDescriptor, PsiClass psiClass, JavaSemanticServices semanticServices, boolean staticMembers) {
this.containingDeclaration = classDescriptor; this.containingDeclaration = classDescriptor;
@@ -62,6 +64,37 @@ public class JavaClassMembersScope implements JetScope {
return classifierDescriptor; return classifierDescriptor;
} }
@Override
public Collection<DeclarationDescriptor> getAllDescriptors() {
if (allDescriptors == null) {
allDescriptors = Sets.newHashSet();
TypeSubstitutor substitutorForGenericSupertypes;
if (containingDeclaration instanceof ClassDescriptor) {
substitutorForGenericSupertypes = semanticServices.getDescriptorResolver().createSubstitutorForGenericSupertypes((ClassDescriptor) containingDeclaration);
}
else {
substitutorForGenericSupertypes = TypeSubstitutor.EMPTY;
}
for (HierarchicalMethodSignature signature : psiClass.getVisibleSignatures()) {
PsiMethod method = signature.getMethod();
if (method.hasModifierProperty(PsiModifier.STATIC) != staticMembers) {
continue;
}
FunctionDescriptor functionDescriptor = semanticServices.getDescriptorResolver().resolveMethodToFunctionDescriptor(psiClass, substitutorForGenericSupertypes, method);
if (functionDescriptor != null) {
allDescriptors.add(functionDescriptor);
}
}
for (PsiField field : psiClass.getAllFields()) {
VariableDescriptor variableDescriptor = semanticServices.getDescriptorResolver().resolveFieldToVariableDescriptor(containingDeclaration, field);
allDescriptors.add(variableDescriptor);
}
}
return allDescriptors;
}
private ClassifierDescriptor doGetClassifierDescriptor(String name) { private ClassifierDescriptor doGetClassifierDescriptor(String name) {
// TODO : suboptimal, walk the list only once // TODO : suboptimal, walk the list only once
for (PsiClass innerClass : psiClass.getAllInnerClasses()) { for (PsiClass innerClass : psiClass.getAllInnerClasses()) {
@@ -90,19 +123,7 @@ public class JavaClassMembersScope implements JetScope {
return null; return null;
} }
JetType type = semanticServices.getTypeTransformer().transformToType(field.getType()); return semanticServices.getDescriptorResolver().resolveFieldToVariableDescriptor((ClassDescriptor) containingDeclaration, field);
boolean isFinal = field.hasModifierProperty(PsiModifier.FINAL);
PropertyDescriptor propertyDescriptor = new PropertyDescriptor(
containingDeclaration,
Collections.<Annotation>emptyList(),
new MemberModifiers(false, false, false),
!isFinal,
null,
field.getName(),
isFinal ? null : type,
type);
semanticServices.getTrace().recordDeclarationResolution(field, propertyDescriptor);
return propertyDescriptor;
} }
@NotNull @NotNull
@@ -46,6 +46,7 @@ public class JavaDescriptorResolver {
protected final Map<String, ClassDescriptor> classDescriptorCache = new HashMap<String, ClassDescriptor>(); protected final Map<String, ClassDescriptor> classDescriptorCache = new HashMap<String, ClassDescriptor>();
protected final Map<PsiTypeParameter, TypeParameterDescriptor> typeParameterDescriptorCache = Maps.newHashMap(); protected final Map<PsiTypeParameter, TypeParameterDescriptor> typeParameterDescriptorCache = Maps.newHashMap();
protected final Map<PsiMethod, FunctionDescriptor> methodDescriptorCache = Maps.newHashMap(); protected final Map<PsiMethod, FunctionDescriptor> methodDescriptorCache = Maps.newHashMap();
protected final Map<PsiField, VariableDescriptor> fieldDescriptorCache = Maps.newHashMap();
protected final Map<String, NamespaceDescriptor> namespaceDescriptorCache = new HashMap<String, NamespaceDescriptor>(); protected final Map<String, NamespaceDescriptor> namespaceDescriptorCache = new HashMap<String, NamespaceDescriptor>();
protected final JavaPsiFacade javaFacade; protected final JavaPsiFacade javaFacade;
protected final GlobalSearchScope javaSearchScope; protected final GlobalSearchScope javaSearchScope;
@@ -262,17 +263,32 @@ public class JavaDescriptorResolver {
return result; return result;
} }
public VariableDescriptor resolveFieldToVariableDescriptor(DeclarationDescriptor containingDeclaration, PsiField field) {
VariableDescriptor variableDescriptor = fieldDescriptorCache.get(field);
if (variableDescriptor != null) {
return variableDescriptor;
}
JetType type = semanticServices.getTypeTransformer().transformToType(field.getType());
boolean isFinal = field.hasModifierProperty(PsiModifier.FINAL);
PropertyDescriptor propertyDescriptor = new PropertyDescriptor(
containingDeclaration,
Collections.<Annotation>emptyList(),
new MemberModifiers(false, false, false),
!isFinal,
null,
field.getName(),
isFinal ? null : type,
type);
semanticServices.getTrace().recordDeclarationResolution(field, propertyDescriptor);
fieldDescriptorCache.put(field, propertyDescriptor);
return propertyDescriptor;
}
@NotNull @NotNull
public FunctionGroup resolveFunctionGroup(@NotNull PsiClass psiClass, @Nullable ClassDescriptor classDescriptor, @NotNull String methodName, boolean staticMembers) { public FunctionGroup resolveFunctionGroup(@NotNull PsiClass psiClass, @Nullable ClassDescriptor classDescriptor, @NotNull String methodName, boolean staticMembers) {
WritableFunctionGroup writableFunctionGroup = new WritableFunctionGroup(methodName); WritableFunctionGroup writableFunctionGroup = new WritableFunctionGroup(methodName);
final Collection<HierarchicalMethodSignature> signatures = psiClass.getVisibleSignatures(); final Collection<HierarchicalMethodSignature> signatures = psiClass.getVisibleSignatures();
TypeSubstitutor typeSubstitutor; TypeSubstitutor typeSubstitutor = createSubstitutorForGenericSupertypes(classDescriptor);
if (classDescriptor != null) {
typeSubstitutor = TypeUtils.buildDeepSubstitutor(classDescriptor.getDefaultType());
}
else {
typeSubstitutor = TypeSubstitutor.EMPTY;
}
for (HierarchicalMethodSignature signature: signatures) { for (HierarchicalMethodSignature signature: signatures) {
PsiMethod method = signature.getMethod(); PsiMethod method = signature.getMethod();
if (method.hasModifierProperty(PsiModifier.STATIC) != staticMembers) { if (method.hasModifierProperty(PsiModifier.STATIC) != staticMembers) {
@@ -281,37 +297,57 @@ public class JavaDescriptorResolver {
if (!methodName.equals(method.getName())) { if (!methodName.equals(method.getName())) {
continue; continue;
} }
FunctionDescriptor functionDescriptor = methodDescriptorCache.get(method);
if (functionDescriptor != null) {
if (method.getContainingClass() != psiClass) {
functionDescriptor = functionDescriptor.substitute(typeSubstitutor);
}
writableFunctionGroup.addFunction(functionDescriptor);
continue;
}
PsiParameter[] parameters = method.getParameterList().getParameters(); FunctionDescriptor substitutedFunctionDescriptor = resolveMethodToFunctionDescriptor(psiClass, typeSubstitutor, method);
FunctionDescriptorImpl functionDescriptorImpl = new FunctionDescriptorImpl(
JavaDescriptorResolver.JAVA_ROOT,
Collections.<Annotation>emptyList(), // TODO
methodName
);
functionDescriptorImpl.initialize(
null,
resolveTypeParameters(functionDescriptorImpl, method.getTypeParameters()),
semanticServices.getDescriptorResolver().resolveParameterDescriptors(functionDescriptorImpl, parameters),
semanticServices.getTypeTransformer().transformToType(method.getReturnType())
);
semanticServices.getTrace().recordDeclarationResolution(method, functionDescriptorImpl);
FunctionDescriptor substitutedFunctionDescriptor = functionDescriptorImpl;
if (method.getContainingClass() != psiClass) {
substitutedFunctionDescriptor = functionDescriptorImpl.substitute(typeSubstitutor);
}
if (substitutedFunctionDescriptor != null) { if (substitutedFunctionDescriptor != null) {
writableFunctionGroup.addFunction(substitutedFunctionDescriptor); writableFunctionGroup.addFunction(substitutedFunctionDescriptor);
} }
methodDescriptorCache.put(method, functionDescriptorImpl);
} }
return writableFunctionGroup; return writableFunctionGroup;
} }
public TypeSubstitutor createSubstitutorForGenericSupertypes(ClassDescriptor classDescriptor) {
TypeSubstitutor typeSubstitutor;
if (classDescriptor != null) {
typeSubstitutor = TypeUtils.buildDeepSubstitutor(classDescriptor.getDefaultType());
}
else {
typeSubstitutor = TypeSubstitutor.EMPTY;
}
return typeSubstitutor;
}
@Nullable
public FunctionDescriptor resolveMethodToFunctionDescriptor(PsiClass psiClass, TypeSubstitutor typeSubstitutorForGenericSuperclasses, PsiMethod method) {
PsiType returnType = method.getReturnType();
if (returnType == null) {
return null;
}
FunctionDescriptor functionDescriptor = methodDescriptorCache.get(method);
if (functionDescriptor != null) {
if (method.getContainingClass() != psiClass) {
functionDescriptor = functionDescriptor.substitute(typeSubstitutorForGenericSuperclasses);
}
return functionDescriptor;
}
PsiParameter[] parameters = method.getParameterList().getParameters();
FunctionDescriptorImpl functionDescriptorImpl = new FunctionDescriptorImpl(
JavaDescriptorResolver.JAVA_ROOT,
Collections.<Annotation>emptyList(), // TODO
method.getName()
);
methodDescriptorCache.put(method, functionDescriptorImpl);
functionDescriptorImpl.initialize(
null,
resolveTypeParameters(functionDescriptorImpl, method.getTypeParameters()),
semanticServices.getDescriptorResolver().resolveParameterDescriptors(functionDescriptorImpl, parameters),
semanticServices.getTypeTransformer().transformToType(returnType)
);
semanticServices.getTrace().recordDeclarationResolution(method, functionDescriptorImpl);
FunctionDescriptor substitutedFunctionDescriptor = functionDescriptorImpl;
if (method.getContainingClass() != psiClass) {
substitutedFunctionDescriptor = functionDescriptorImpl.substitute(typeSubstitutorForGenericSuperclasses);
}
return substitutedFunctionDescriptor;
}
} }
@@ -64,6 +64,11 @@ public class ErrorUtils {
return ERROR_CLASS; // TODO : review return ERROR_CLASS; // TODO : review
} }
@Override
public Collection<DeclarationDescriptor> getAllDescriptors() {
return Collections.emptyList();
}
}; };
private static final FunctionGroup ERROR_FUNCTION_GROUP = new FunctionGroup() { private static final FunctionGroup ERROR_FUNCTION_GROUP = new FunctionGroup() {
@@ -667,6 +667,7 @@ public class JetTypeInferrer {
} }
trace.markAsProcessed(expression); trace.markAsProcessed(expression);
trace.recordResolutionScope(expression, scope);
return result; return result;
} }
@@ -9,6 +9,7 @@ import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.lang.resolve.BindingTrace; import org.jetbrains.jet.lang.resolve.BindingTrace;
import org.jetbrains.jet.lang.resolve.JetScope;
import org.jetbrains.jet.lang.types.JetType; import org.jetbrains.jet.lang.types.JetType;
import java.util.Collection; import java.util.Collection;
@@ -52,6 +53,10 @@ public class JetTestUtils {
public void recordStatement(@NotNull JetElement statement) { public void recordStatement(@NotNull JetElement statement) {
} }
@Override
public void recordResolutionScope(@NotNull JetExpression expression, @NotNull JetScope scope) {
}
@Override @Override
public void removeStatementRecord(@NotNull JetElement statement) { public void removeStatementRecord(@NotNull JetElement statement) {
} }
@@ -189,6 +194,11 @@ public class JetTestUtils {
throw new UnsupportedOperationException(); // TODO throw new UnsupportedOperationException(); // TODO
} }
@Override
public JetScope getResolutionScope(@NotNull JetExpression expression) {
throw new UnsupportedOperationException(); // TODO
}
@Override @Override
public Collection<JetDiagnostic> getDiagnostics() { public Collection<JetDiagnostic> getDiagnostics() {
throw new UnsupportedOperationException(); // TODO throw new UnsupportedOperationException(); // TODO