diff --git a/idea/src/org/jetbrains/jet/lang/psi/JetChangeUtil.java b/idea/src/org/jetbrains/jet/lang/psi/JetChangeUtil.java index 22623f54bc5..c28e18a82df 100644 --- a/idea/src/org/jetbrains/jet/lang/psi/JetChangeUtil.java +++ b/idea/src/org/jetbrains/jet/lang/psi/JetChangeUtil.java @@ -54,4 +54,8 @@ public class JetChangeUtil { public static PsiElement createNameIdentifier(Project project, String name) { return createProperty(project, name, null).getNameIdentifier(); } + + public static JetFunction createFunction(Project project, String funDecl) { + return createDeclaration(project, funDecl, JetFunction.class); + } } diff --git a/idea/src/org/jetbrains/jet/lang/resolve/ClassDescriptorResolver.java b/idea/src/org/jetbrains/jet/lang/resolve/ClassDescriptorResolver.java index ee6f16389f3..14132b1f083 100644 --- a/idea/src/org/jetbrains/jet/lang/resolve/ClassDescriptorResolver.java +++ b/idea/src/org/jetbrains/jet/lang/resolve/ClassDescriptorResolver.java @@ -84,7 +84,8 @@ public class ClassDescriptorResolver { return memberDeclarations; } - private FunctionDescriptor resolveFunctionDescriptor(JetScope scope, JetFunction function) { + @NotNull + public FunctionDescriptor resolveFunctionDescriptor(JetScope scope, JetFunction function) { ParameterExtensibleScope parameterScope = new ParameterExtensibleScope(scope); // The two calls below have side-effects on parameterScope List typeParameterDescriptors = resolveTypeParameters(parameterScope, function.getTypeParameters()); diff --git a/idea/src/org/jetbrains/jet/lang/types/JetTypeChecker.java b/idea/src/org/jetbrains/jet/lang/types/JetTypeChecker.java index b682598c5dd..c50d67d7374 100644 --- a/idea/src/org/jetbrains/jet/lang/types/JetTypeChecker.java +++ b/idea/src/org/jetbrains/jet/lang/types/JetTypeChecker.java @@ -367,7 +367,7 @@ public class JetTypeChecker { @Override public void visitReferenceExpression(JetReferenceExpression expression) { // a -- create a hierarchical lookup domain for this.a - throw new UnsupportedOperationException(); // TODO + result[0] = OverloadResolver.INSTANCE.getOverloadDomain(null, scope, expression.getReferencedName()); } @Override diff --git a/idea/tests/org/jetbrains/jet/types/JetTypeCheckerTest.java b/idea/tests/org/jetbrains/jet/types/JetTypeCheckerTest.java index 96616c5a205..ff6ff034313 100644 --- a/idea/tests/org/jetbrains/jet/types/JetTypeCheckerTest.java +++ b/idea/tests/org/jetbrains/jet/types/JetTypeCheckerTest.java @@ -323,6 +323,14 @@ public class JetTypeCheckerTest extends LightDaemonAnalyzerTestCase { assertType("new Functions().f(1d)", (String) null); assertType("new Functions().f(())", "Double"); assertType("new Functions().f(1d)", "Any"); + assertType("new Functions().f(\"\")", "Byte"); + assertType("new Functions().f(1)", (String) null); + + assertType("f()", "Unit"); + assertType("f(1)", "Int"); + assertType("f(1f, 1)", "Float"); + assertType("f(1f)", "String"); + assertType("f(1.0)", (String) null); } // public void testImplicitConversions() throws Exception { @@ -434,8 +442,15 @@ public class JetTypeCheckerTest extends LightDaemonAnalyzerTestCase { "fun f(a : Int) : Int {} " + "fun f(a : T) : Any {} " + "fun f(a : Unit) : T {} " + + "fun f(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(a : Float) : T {a}", + }; public static JetScope BASIC_SCOPE = new JetScopeAdapter(JetStandardClasses.STANDARD_CLASSES) { @Override @@ -453,6 +468,19 @@ public class JetTypeCheckerTest extends LightDaemonAnalyzerTestCase { } 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; + } }; } -} +} \ No newline at end of file