Basic lookup for unqualified function calls

This commit is contained in:
Andrey Breslav
2011-02-21 18:39:08 +03:00
parent c2c3d92abc
commit c2c9f51ca8
4 changed files with 36 additions and 3 deletions
@@ -54,4 +54,8 @@ public class JetChangeUtil {
public static PsiElement createNameIdentifier(Project project, String name) { public static PsiElement createNameIdentifier(Project project, String name) {
return createProperty(project, name, null).getNameIdentifier(); return createProperty(project, name, null).getNameIdentifier();
} }
public static JetFunction createFunction(Project project, String funDecl) {
return createDeclaration(project, funDecl, JetFunction.class);
}
} }
@@ -84,7 +84,8 @@ public class ClassDescriptorResolver {
return memberDeclarations; return memberDeclarations;
} }
private FunctionDescriptor resolveFunctionDescriptor(JetScope scope, JetFunction function) { @NotNull
public FunctionDescriptor resolveFunctionDescriptor(JetScope scope, JetFunction function) {
ParameterExtensibleScope parameterScope = new ParameterExtensibleScope(scope); ParameterExtensibleScope parameterScope = new ParameterExtensibleScope(scope);
// The two calls below have side-effects on parameterScope // The two calls below have side-effects on parameterScope
List<TypeParameterDescriptor> typeParameterDescriptors = resolveTypeParameters(parameterScope, function.getTypeParameters()); List<TypeParameterDescriptor> typeParameterDescriptors = resolveTypeParameters(parameterScope, function.getTypeParameters());
@@ -367,7 +367,7 @@ public class JetTypeChecker {
@Override @Override
public void visitReferenceExpression(JetReferenceExpression expression) { public void visitReferenceExpression(JetReferenceExpression expression) {
// a -- create a hierarchical lookup domain for this.a // a -- create a hierarchical lookup domain for this.a
throw new UnsupportedOperationException(); // TODO result[0] = OverloadResolver.INSTANCE.getOverloadDomain(null, scope, expression.getReferencedName());
} }
@Override @Override
@@ -323,6 +323,14 @@ public class JetTypeCheckerTest extends LightDaemonAnalyzerTestCase {
assertType("new Functions<String>().f(1d)", (String) null); assertType("new Functions<String>().f(1d)", (String) null);
assertType("new Functions<Double>().f(())", "Double"); assertType("new Functions<Double>().f(())", "Double");
assertType("new Functions<Double>().f(1d)", "Any"); assertType("new Functions<Double>().f(1d)", "Any");
assertType("new Functions<Byte>().f<String>(\"\")", "Byte");
assertType("new Functions<Byte>().f<String>(1)", (String) null);
assertType("f()", "Unit");
assertType("f(1)", "Int");
assertType("f(1f, 1)", "Float");
assertType("f<String>(1f)", "String");
assertType("f(1.0)", (String) null);
} }
// public void testImplicitConversions() throws Exception { // public void testImplicitConversions() throws Exception {
@@ -434,8 +442,15 @@ public class JetTypeCheckerTest extends LightDaemonAnalyzerTestCase {
"fun f(a : Int) : Int {} " + "fun f(a : Int) : Int {} " +
"fun f(a : T) : Any {} " + "fun f(a : T) : Any {} " +
"fun f(a : Unit) : T {} " + "fun f(a : Unit) : T {} " +
"fun f<E>(a : E) : T {} " +
"}" "}"
}; };
private static String[] FUNCTION_DECLARATIONS = {
"fun f() : Unit {}",
"fun f(a : Int) : Int {a}",
"fun f(a : Float, b : Int) : Float {a}",
"fun f<T>(a : Float) : T {a}",
};
public static JetScope BASIC_SCOPE = new JetScopeAdapter(JetStandardClasses.STANDARD_CLASSES) { public static JetScope BASIC_SCOPE = new JetScopeAdapter(JetStandardClasses.STANDARD_CLASSES) {
@Override @Override
@@ -453,6 +468,19 @@ public class JetTypeCheckerTest extends LightDaemonAnalyzerTestCase {
} }
return super.getClass(name); return super.getClass(name);
} }
@NotNull
@Override
public FunctionGroup getFunctionGroup(@NotNull String name) {
WritableFunctionGroup writableFunctionGroup = new WritableFunctionGroup(name);
for (String funDecl : FUNCTION_DECLARATIONS) {
FunctionDescriptor functionDescriptor = ClassDescriptorResolver.INSTANCE.resolveFunctionDescriptor(this, JetChangeUtil.createFunction(getProject(), funDecl));
if (name.equals(functionDescriptor.getName())) {
writableFunctionGroup.addFunction(functionDescriptor);
}
}
return writableFunctionGroup;
}
}; };
} }
} }