From 5c8b060a49eab7a94428ce1b1e8f805057389292 Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Thu, 29 Sep 2011 21:02:25 +0400 Subject: [PATCH] Stub support for varargs --- .../jetbrains/jet/lang/diagnostics/Errors.java | 2 +- .../lang/resolve/ClassDescriptorResolver.java | 5 ++--- .../calls/ValueArgumentsToParametersMapper.java | 2 +- .../src/org/jetbrains/jet/lexer/JetTokens.java | 5 +++-- .../jet/resolve/DescriptorRenderer.java | 3 +++ .../quick/NamedArgumentsAndDefaultValues.jet | 3 +++ .../checkerWithErrorTypes/quick/Varargs.jet | 17 +++++++++++++++++ 7 files changed, 30 insertions(+), 7 deletions(-) create mode 100644 idea/testData/checkerWithErrorTypes/quick/Varargs.jet diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java index 87535768bfb..cabc78f70a6 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java @@ -353,7 +353,7 @@ public interface Errors { ParameterizedDiagnosticFactory1> OVERLOAD_RESOLUTION_AMBIGUITY = new AmbiguousDescriptorDiagnosticFactory("Overload resolution ambiguity: {0}"); ParameterizedDiagnosticFactory1> NONE_APPLICABLE = new AmbiguousDescriptorDiagnosticFactory("None of the following functions can be called with the arguments supplied: {0}"); - ParameterizedDiagnosticFactory1 NO_VALUE_FOR_PARAMETER = ParameterizedDiagnosticFactory1.create(ERROR, "No value passed for parameter {0}"); + ParameterizedDiagnosticFactory1 NO_VALUE_FOR_PARAMETER = ParameterizedDiagnosticFactory1.create(ERROR, "No value passed for parameter {0}", DescriptorRenderer.TEXT); ParameterizedDiagnosticFactory1 MISSING_RECEIVER = ParameterizedDiagnosticFactory1.create(ERROR, "A receiver of type {0} is required"); SimpleDiagnosticFactory NO_RECEIVER_ADMITTED = SimpleDiagnosticFactory.create(ERROR, "No receiver can be passed to this function or property"); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/ClassDescriptorResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/ClassDescriptorResolver.java index ad9595825b5..baf401bde60 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/ClassDescriptorResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/ClassDescriptorResolver.java @@ -258,9 +258,8 @@ public class ClassDescriptorResolver { valueParameter.isMutable() ? type : null, type, valueParameter.getDefaultValue() != null, - false // TODO : varargs - ); - // TODO : Default values??? + valueParameter.hasModifier(JetTokens.VARARG_KEYWORD) + ); trace.record(BindingContext.VALUE_PARAMETER, valueParameter, valueParameterDescriptor); return valueParameterDescriptor; diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/ValueArgumentsToParametersMapper.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/ValueArgumentsToParametersMapper.java index 9792f35e9c4..a044f24d0da 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/ValueArgumentsToParametersMapper.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/ValueArgumentsToParametersMapper.java @@ -148,7 +148,7 @@ import static org.jetbrains.jet.lang.resolve.BindingContext.REFERENCE_TARGET; for (ValueParameterDescriptor valueParameter : valueParameters) { if (!usedParameters.contains(valueParameter)) { - if (!valueParameter.hasDefaultValue()) { + if (!valueParameter.hasDefaultValue() && !valueParameter.isVararg()) { // tracing.reportWrongValueArguments(temporaryTrace, "No value passed for parameter " + valueParameter.getName()); tracing.noValueForParameter(temporaryTrace, valueParameter); error = true; diff --git a/compiler/frontend/src/org/jetbrains/jet/lexer/JetTokens.java b/compiler/frontend/src/org/jetbrains/jet/lexer/JetTokens.java index 496bf89ad0f..476d1e20751 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lexer/JetTokens.java +++ b/compiler/frontend/src/org/jetbrains/jet/lexer/JetTokens.java @@ -135,6 +135,7 @@ public interface JetTokens { JetKeywordToken PROTECTED_KEYWORD = JetKeywordToken.softKeyword("protected"); JetKeywordToken CATCH_KEYWORD = JetKeywordToken.softKeyword("catch"); JetKeywordToken OUT_KEYWORD = JetKeywordToken.softKeyword("out"); + JetKeywordToken VARARG_KEYWORD = JetKeywordToken.softKeyword("vararg"); JetKeywordToken FINALLY_KEYWORD = JetKeywordToken.softKeyword("finally"); JetKeywordToken FINAL_KEYWORD = JetKeywordToken.softKeyword("final"); @@ -154,12 +155,12 @@ public interface JetTokens { TokenSet SOFT_KEYWORDS = TokenSet.create(IMPORT_KEYWORD, WHERE_KEYWORD, BY_KEYWORD, GET_KEYWORD, SET_KEYWORD, ABSTRACT_KEYWORD, ENUM_KEYWORD, OPEN_KEYWORD, ANNOTATION_KEYWORD, OVERRIDE_KEYWORD, PRIVATE_KEYWORD, PUBLIC_KEYWORD, INTERNAL_KEYWORD, PROTECTED_KEYWORD, - CATCH_KEYWORD, FINALLY_KEYWORD, REF_KEYWORD, OUT_KEYWORD, FINAL_KEYWORD + CATCH_KEYWORD, FINALLY_KEYWORD, REF_KEYWORD, OUT_KEYWORD, FINAL_KEYWORD, VARARG_KEYWORD ); TokenSet MODIFIER_KEYWORDS = TokenSet.create(ABSTRACT_KEYWORD, ENUM_KEYWORD, OPEN_KEYWORD, ANNOTATION_KEYWORD, OVERRIDE_KEYWORD, PRIVATE_KEYWORD, PUBLIC_KEYWORD, INTERNAL_KEYWORD, - PROTECTED_KEYWORD, REF_KEYWORD, OUT_KEYWORD, IN_KEYWORD, FINAL_KEYWORD + PROTECTED_KEYWORD, REF_KEYWORD, OUT_KEYWORD, IN_KEYWORD, FINAL_KEYWORD, VARARG_KEYWORD ); TokenSet WHITE_SPACE_OR_COMMENT_BIT_SET = TokenSet.create(WHITE_SPACE, BLOCK_COMMENT, EOL_COMMENT, DOC_COMMENT); TokenSet WHITESPACES = TokenSet.create(TokenType.WHITE_SPACE); diff --git a/compiler/frontend/src/org/jetbrains/jet/resolve/DescriptorRenderer.java b/compiler/frontend/src/org/jetbrains/jet/resolve/DescriptorRenderer.java index 93f0b82db9e..4e3542c197e 100644 --- a/compiler/frontend/src/org/jetbrains/jet/resolve/DescriptorRenderer.java +++ b/compiler/frontend/src/org/jetbrains/jet/resolve/DescriptorRenderer.java @@ -133,6 +133,9 @@ public class DescriptorRenderer implements Renderer { @Override public Void visitValueParameterDescriptor(ValueParameterDescriptor descriptor, StringBuilder builder) { builder.append(renderKeyword("value-parameter")).append(" "); + if (descriptor.isVararg()) { + builder.append(renderKeyword("vararg")).append(" "); + } return super.visitValueParameterDescriptor(descriptor, builder); } diff --git a/idea/testData/checkerWithErrorTypes/quick/NamedArgumentsAndDefaultValues.jet b/idea/testData/checkerWithErrorTypes/quick/NamedArgumentsAndDefaultValues.jet index a021255f0d7..b4ef3f1e47c 100644 --- a/idea/testData/checkerWithErrorTypes/quick/NamedArgumentsAndDefaultValues.jet +++ b/idea/testData/checkerWithErrorTypes/quick/NamedArgumentsAndDefaultValues.jet @@ -1,6 +1,9 @@ fun foo(a : Int = 1, b : String = "abc") { } +fun bar(x : Int = "", y : Int = 1, z : String) { +} + fun test() { foo() foo(2) diff --git a/idea/testData/checkerWithErrorTypes/quick/Varargs.jet b/idea/testData/checkerWithErrorTypes/quick/Varargs.jet new file mode 100644 index 00000000000..7904791df5a --- /dev/null +++ b/idea/testData/checkerWithErrorTypes/quick/Varargs.jet @@ -0,0 +1,17 @@ +fun v(x : Int, y : String, vararg f : Long) {} +fun v1(vararg f : fun (Int) : Unit) {} + +fun test() { + v(1, "") + v(1, "", 1) + v(1, "", 1, 1, 1) + v(1, "", 1, 1, 1) + + v1() + v1({}) + v1({}, {}) + v1({}, 1, {}) + v1({}, {}, {it}) + v1({}) {} + v1 {} +}