KT-1130 Remove ref from keywords

This commit is contained in:
Andrey Breslav
2012-01-25 12:46:50 +04:00
parent 4c4aafd2d3
commit 90b98a63b5
22 changed files with 92 additions and 152 deletions
@@ -0,0 +1,22 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="IDEA (No ProcessCanceledException)" type="Application" factoryName="Application">
<option name="MAIN_CLASS_NAME" value="com.intellij.idea.Main" />
<option name="VM_PARAMETERS" value="-Xmx500m -XX:ReservedCodeCacheSize=64m -XX:MaxPermSize=250m -ea -Didea.is.internal=true -Didea.debug.mode=true -Didea.system.path=../system -Didea.config.path=../config -Dapple.laf.useScreenMenuBar=true -Didea.ProcessCanceledException=disabled" />
<option name="PROGRAM_PARAMETERS" value="" />
<option name="WORKING_DIRECTORY" value="file://$PROJECT_DIR$/ideaSDK/bin" />
<option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
<option name="ALTERNATIVE_JRE_PATH" value="" />
<option name="ENABLE_SWING_INSPECTOR" value="false" />
<option name="ENV_VARIABLES" />
<option name="PASS_PARENT_ENVS" value="true" />
<module name="idea" />
<envs />
<RunnerSettings RunnerId="Debug">
<option name="DEBUG_PORT" value="" />
<option name="TRANSPORT" value="0" />
<option name="LOCAL" value="true" />
</RunnerSettings>
<ConfigurationWrapper RunnerId="Debug" />
<method />
</configuration>
</component>
@@ -197,7 +197,6 @@ public interface Errors {
SimpleDiagnosticFactory NAMESPACE_IS_NOT_AN_EXPRESSION = SimpleDiagnosticFactory.create(ERROR, "'namespace' is not an expression, it can only be used on the left-hand side of a dot ('.')");
ParameterizedDiagnosticFactory1<String> SUPER_IS_NOT_AN_EXPRESSION = ParameterizedDiagnosticFactory1.create(ERROR, "{0} is not an expression, it can only be used on the left-hand side of a dot ('.')");
SimpleDiagnosticFactory DECLARATION_IN_ILLEGAL_CONTEXT = SimpleDiagnosticFactory.create(ERROR, "Declarations are not allowed in this position");
SimpleDiagnosticFactory REF_SETTER_PARAMETER = SimpleDiagnosticFactory.create(ERROR, "Setter parameters can not be 'ref'");
SimpleDiagnosticFactory SETTER_PARAMETER_WITH_DEFAULT_VALUE = SimpleDiagnosticFactory.create(ERROR, "Setter parameters can not have default values");
SimpleDiagnosticFactory NO_THIS = SimpleDiagnosticFactory.create(ERROR, "'this' is not defined in this context");
SimpleDiagnosticFactory SUPER_NOT_AVAILABLE = SimpleDiagnosticFactory.create(ERROR, "No supertypes are accessible in this context");
@@ -290,7 +289,6 @@ public interface Errors {
ParameterizedDiagnosticFactory1<String> ILLEGAL_SELECTOR = ParameterizedDiagnosticFactory1.create(ERROR, "Expression ''{0}'' cannot be a selector (occur after a dot)");
SimpleDiagnosticFactory REF_PARAMETER_WITH_VAL_OR_VAR = SimpleDiagnosticFactory.create(ERROR, "'val' and 'var' are not allowed on ref-parameters");
SimpleDiagnosticFactory VALUE_PARAMETER_WITH_NO_TYPE_ANNOTATION = SimpleDiagnosticFactory.create(ERROR, "A type annotation is required on a value parameter");
SimpleDiagnosticFactory BREAK_OR_CONTINUE_OUTSIDE_A_LOOP = SimpleDiagnosticFactory.create(ERROR, "'break' and 'continue' are only allowed inside a loop");
ParameterizedDiagnosticFactory1<String> NOT_A_LOOP_LABEL = ParameterizedDiagnosticFactory1.create(ERROR, "The label ''{0}'' does not denote a loop");
@@ -1817,7 +1817,7 @@ public class JetExpressionParsing extends AbstractJetParsing {
}
/*
* (SimpleName "=")? ("out" | "ref")? element
* (SimpleName "=")? element
*/
private void parseValueArgument() {
PsiBuilder.Marker argument = mark();
@@ -1829,7 +1829,6 @@ public class JetExpressionParsing extends AbstractJetParsing {
argName.done(VALUE_ARGUMENT_NAME);
advance(); // EQ
}
if (at(OUT_KEYWORD) || at(REF_KEYWORD)) advance(); // REF or OUT
parseExpression();
argument.done(VALUE_ARGUMENT);
}
@@ -1398,9 +1398,11 @@ public class JetParsing extends AbstractJetParsing {
while (true) {
PsiBuilder.Marker projection = mark();
TokenSet lookFor = TokenSet.create(IDENTIFIER);
TokenSet stopAt = TokenSet.create(COMMA, COLON, GT);
parseModifierListWithShortAnnotations(MODIFIER_LIST, lookFor, stopAt);
// TokenSet lookFor = TokenSet.create(IDENTIFIER);
// TokenSet stopAt = TokenSet.create(COMMA, COLON, GT);
// parseModifierListWithShortAnnotations(MODIFIER_LIST, lookFor, stopAt);
// Currently we do not allow annotations
parseModifierList(MODIFIER_LIST, false);
if (at(MUL)) {
advance(); // MUL
@@ -1429,7 +1431,7 @@ public class JetParsing extends AbstractJetParsing {
private void parseModifierListWithShortAnnotations(JetNodeType modifierList, TokenSet lookFor, TokenSet stopAt) {
int lastId = findLastBefore(lookFor, stopAt, false);
createTruncatedBuilder(lastId).parseModifierList(modifierList, false);
createTruncatedBuilder(lastId).parseModifierList(modifierList, true);
}
/*
@@ -44,19 +44,8 @@ public class JetParameter extends JetNamedDeclaration {
return null;
}
public boolean isRef() {
ASTNode refNode = getRefNode();
return refNode != null;
}
@Nullable
public ASTNode getRefNode() {
JetModifierList modifierList = getModifierList();
return modifierList == null ? null : modifierList.getModifierNode(JetTokens.REF_KEYWORD);
}
public boolean isMutable() {
return findChildByType(JetTokens.VAR_KEYWORD) != null || isRef();
return findChildByType(JetTokens.VAR_KEYWORD) != null;
}
public boolean isVarArg() {
@@ -5,7 +5,6 @@ import com.intellij.psi.PsiElement;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.JetNodeTypes;
import org.jetbrains.jet.lexer.JetTokens;
/**
* @author max
@@ -41,16 +40,6 @@ public class JetValueArgument extends JetElement implements ValueArgument {
return getArgumentName() != null;
}
@Override
public boolean isOut() {
return findChildByType(JetTokens.OUT_KEYWORD) != null;
}
@Override
public boolean isRef() {
return findChildByType(JetTokens.REF_KEYWORD) != null;
}
@NotNull
@Override
public PsiElement asElement() {
@@ -17,10 +17,6 @@ public interface ValueArgument {
boolean isNamed();
boolean isOut();
boolean isRef();
@NotNull
PsiElement asElement();
@@ -10,7 +10,6 @@ import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.JetSemanticServices;
import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor;
import org.jetbrains.jet.lang.diagnostics.Errors;
import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.jet.lang.resolve.calls.autocasts.DataFlowInfo;
import org.jetbrains.jet.lang.resolve.scopes.JetScope;
@@ -229,12 +228,6 @@ public class DescriptorResolver {
JetParameter valueParameter = valueParameters.get(i);
JetTypeReference typeReference = valueParameter.getTypeReference();
ASTNode valOrVarNode = valueParameter.getValOrVarNode();
if (valueParameter.isRef() && valOrVarNode != null) {
// trace.getErrorHandler().genericError(valOrVarNode, "'val' and 'var' are not allowed on ref-parameters");
trace.report(REF_PARAMETER_WITH_VAL_OR_VAR.on(valOrVarNode));
}
JetType type;
if (typeReference == null) {
// trace.getErrorHandler().genericError(valueParameter.getNode(), "A type annotation is required on a value parameter");
@@ -653,15 +646,10 @@ public class DescriptorResolver {
resolveVisibilityFromModifiers(setter.getModifierList(), propertyDescriptor.getVisibility()),
setter.getBodyExpression() != null, false);
if (parameter != null) {
if (parameter.isRef()) {
// trace.getErrorHandler().genericError(parameter.getRefNode(), "Setter parameters can not be 'ref'");
trace.report(Errors.REF_SETTER_PARAMETER.on(parameter.getRefNode()));
}
// This check is redundant: the parser does not allow a default value, but we'll keep it just in case
JetExpression defaultValue = parameter.getDefaultValue();
if (defaultValue != null) {
// trace.getErrorHandler().genericError(defaultValue.getNode(), "Setter parameters can not have default values");
trace.report(SETTER_PARAMETER_WITH_DEFAULT_VALUE.on(defaultValue));
}
@@ -675,7 +663,6 @@ public class DescriptorResolver {
JetType inType = propertyDescriptor.getOutType();
if (inType != null) {
if (!TypeUtils.equalTypes(type, inType)) {
// trace.getErrorHandler().genericError(typeReference.getNode(), "Setter parameter type must be equal to the type of the property, i.e. " + inType);
trace.report(WRONG_SETTER_PARAMETER_TYPE.on(setter, typeReference, inType));
}
}
@@ -45,16 +45,6 @@ public class CallMaker {
return false;
}
@Override
public boolean isOut() {
return false;
}
@Override
public boolean isRef() {
return false;
}
@NotNull
@Override
public PsiElement asElement() {
@@ -143,9 +143,6 @@ public interface JetTokens {
JetKeywordToken FINALLY_KEYWORD = JetKeywordToken.softKeyword("finally");
JetKeywordToken FINAL_KEYWORD = JetKeywordToken.softKeyword("final");
// TODO: support this as an annotation on arguments. Then, they it probably can not be a soft keyword
JetKeywordToken REF_KEYWORD = JetKeywordToken.softKeyword("ref");
TokenSet KEYWORDS = TokenSet.create(PACKAGE_KEYWORD, AS_KEYWORD, TYPE_KEYWORD, CLASS_KEYWORD, TRAIT_KEYWORD,
THIS_KEYWORD, SUPER_KEYWORD, VAL_KEYWORD, VAR_KEYWORD, FUN_KEYWORD, FOR_KEYWORD,
NULL_KEYWORD,
@@ -158,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, VARARG_KEYWORD, INLINE_KEYWORD, ERASED_KEYWORD
CATCH_KEYWORD, FINALLY_KEYWORD, OUT_KEYWORD, FINAL_KEYWORD, VARARG_KEYWORD, INLINE_KEYWORD, ERASED_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, VARARG_KEYWORD, INLINE_KEYWORD, ERASED_KEYWORD
PROTECTED_KEYWORD, OUT_KEYWORD, IN_KEYWORD, FINAL_KEYWORD, VARARG_KEYWORD, INLINE_KEYWORD, ERASED_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);
@@ -1,6 +1,6 @@
var x : Int = 1 + x
get() : Int = 1
set(<!REF_SETTER_PARAMETER!>ref<!> value : <!WRONG_SETTER_PARAMETER_TYPE!>Long<!>) {
set(value : <!WRONG_SETTER_PARAMETER_TYPE!>Long<!>) {
$x = value.int
$x = <!TYPE_MISMATCH!>1.lng<!>
}
+12 -2
View File
@@ -153,7 +153,12 @@ JetFile: Attributes.jet
PsiWhiteSpace('\n')
PsiElement(out)('out')
PsiWhiteSpace('\n')
PsiElement(ref)('ref')
ANNOTATION_ENTRY
CONSTRUCTOR_CALLEE
TYPE_REFERENCE
USER_TYPE
REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('ref')
PsiWhiteSpace('\n ')
PsiElement(class)('class')
PsiWhiteSpace(' ')
@@ -306,7 +311,12 @@ JetFile: Attributes.jet
PsiWhiteSpace('\n')
PsiElement(out)('out')
PsiWhiteSpace('\n')
PsiElement(ref)('ref')
ANNOTATION_ENTRY
CONSTRUCTOR_CALLEE
TYPE_REFERENCE
USER_TYPE
REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('ref')
PsiWhiteSpace(' ')
PsiElement(IDENTIFIER)('T')
PsiElement(GT)('>')
+12 -2
View File
@@ -189,7 +189,12 @@ JetFile: Attributes_ERR.jet
PsiWhiteSpace('\n')
PsiElement(out)('out')
PsiWhiteSpace('\n')
PsiElement(ref)('ref')
ANNOTATION_ENTRY
CONSTRUCTOR_CALLEE
TYPE_REFERENCE
USER_TYPE
REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('ref')
PsiWhiteSpace('\n ')
PsiElement(class)('class')
PsiWhiteSpace(' ')
@@ -262,7 +267,12 @@ JetFile: Attributes_ERR.jet
PsiWhiteSpace('\n')
PsiElement(out)('out')
PsiWhiteSpace('\n')
PsiElement(ref)('ref')
ANNOTATION_ENTRY
CONSTRUCTOR_CALLEE
TYPE_REFERENCE
USER_TYPE
REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('ref')
PsiWhiteSpace(' ')
PsiElement(IDENTIFIER)('T')
PsiElement(GT)('>')
+1 -1
View File
@@ -13,7 +13,7 @@ type f = (foo, a : a) -> b
type f = (foo, a : (a) -> b) -> b
type f = (foo, a : (a) -> b) -> () -> #()
type f = (ref foo, ref a : (ref a) -> b) -> () -> #()
//type f = (ref foo, ref a : (ref a) -> b) -> () -> #()
type f = T.() -> #()
type f = T.T.() -> #()
+1 -68
View File
@@ -446,74 +446,7 @@ JetFile: FunctionTypes.jet
PsiElement(LPAR)('(')
PsiElement(RPAR)(')')
PsiWhiteSpace('\n\n')
TYPEDEF
PsiElement(type)('type')
PsiWhiteSpace(' ')
PsiElement(IDENTIFIER)('f')
PsiWhiteSpace(' ')
TYPE_PARAMETER_LIST
<empty list>
PsiElement(EQ)('=')
PsiWhiteSpace(' ')
TYPE_REFERENCE
FUNCTION_TYPE
VALUE_PARAMETER_LIST
PsiElement(LPAR)('(')
VALUE_PARAMETER
MODIFIER_LIST
PsiElement(ref)('ref')
PsiWhiteSpace(' ')
TYPE_REFERENCE
USER_TYPE
REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('foo')
PsiElement(COMMA)(',')
PsiWhiteSpace(' ')
VALUE_PARAMETER
MODIFIER_LIST
PsiElement(ref)('ref')
PsiWhiteSpace(' ')
PsiElement(IDENTIFIER)('a')
PsiWhiteSpace(' ')
PsiElement(COLON)(':')
PsiWhiteSpace(' ')
TYPE_REFERENCE
FUNCTION_TYPE
VALUE_PARAMETER_LIST
PsiElement(LPAR)('(')
VALUE_PARAMETER
MODIFIER_LIST
PsiElement(ref)('ref')
PsiWhiteSpace(' ')
TYPE_REFERENCE
USER_TYPE
REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('a')
PsiElement(RPAR)(')')
PsiWhiteSpace(' ')
PsiElement(ARROW)('->')
PsiWhiteSpace(' ')
TYPE_REFERENCE
USER_TYPE
REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('b')
PsiElement(RPAR)(')')
PsiWhiteSpace(' ')
PsiElement(ARROW)('->')
PsiWhiteSpace(' ')
TYPE_REFERENCE
FUNCTION_TYPE
VALUE_PARAMETER_LIST
PsiElement(LPAR)('(')
PsiElement(RPAR)(')')
PsiWhiteSpace(' ')
PsiElement(ARROW)('->')
PsiWhiteSpace(' ')
TYPE_REFERENCE
TUPLE_TYPE
PsiElement(HASH)('#')
PsiElement(LPAR)('(')
PsiElement(RPAR)(')')
PsiComment(EOL_COMMENT)('//type f = (ref foo, ref a : (ref a) -> b) -> () -> #()')
PsiWhiteSpace('\n\n')
TYPEDEF
PsiElement(type)('type')
+12 -2
View File
@@ -40,7 +40,12 @@ JetFile: SimpleModifiers.jet
PsiWhiteSpace('\n')
PsiElement(out)('out')
PsiWhiteSpace('\n')
PsiElement(ref)('ref')
ANNOTATION_ENTRY
CONSTRUCTOR_CALLEE
TYPE_REFERENCE
USER_TYPE
REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('ref')
PsiWhiteSpace('\n ')
PsiElement(class)('class')
PsiWhiteSpace(' ')
@@ -77,7 +82,12 @@ JetFile: SimpleModifiers.jet
PsiWhiteSpace('\n ')
PsiElement(out)('out')
PsiWhiteSpace('\n ')
PsiElement(ref)('ref')
ANNOTATION_ENTRY
CONSTRUCTOR_CALLEE
TYPE_REFERENCE
USER_TYPE
REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('ref')
PsiWhiteSpace(' ')
PsiElement(IDENTIFIER)('T')
PsiElement(GT)('>')
+6 -1
View File
@@ -54,7 +54,12 @@ JetFile: SoftKeywords.jet
PsiWhiteSpace('\n')
PsiElement(out)('out')
PsiWhiteSpace('\n')
PsiElement(ref)('ref')
ANNOTATION_ENTRY
CONSTRUCTOR_CALLEE
TYPE_REFERENCE
USER_TYPE
REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('ref')
PsiWhiteSpace('\n ')
PsiElement(class)('class')
PsiWhiteSpace(' ')
@@ -2,7 +2,8 @@ class Foo<out abstract, out out> {}
fun f() {
Foo<out out>
// Foo<out out>
Foo<out Int>
}
@@ -35,7 +35,9 @@ JetFile: SoftKeywordsInTypeArguments.jet
PsiWhiteSpace(' ')
BLOCK
PsiElement(LBRACE)('{')
PsiWhiteSpace('\n\n ')
PsiWhiteSpace('\n\n')
PsiComment(EOL_COMMENT)('// Foo<out out>')
PsiWhiteSpace('\n ')
CALL_EXPRESSION
REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('Foo')
@@ -48,7 +50,7 @@ JetFile: SoftKeywordsInTypeArguments.jet
TYPE_REFERENCE
USER_TYPE
REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('out')
PsiElement(IDENTIFIER)('Int')
PsiElement(GT)('>')
PsiWhiteSpace('\n\n')
PsiElement(RBRACE)('}')
@@ -36,7 +36,7 @@ class BinaryTree<T> : IMutableSet<T> {
}
override fun add(item : T) : Boolean {
if (add(ref root, null)) {
if (add(Ref(root), null)) {
size++
version++
return true
@@ -45,15 +45,15 @@ class BinaryTree<T> : IMutableSet<T> {
// In principle, this has access to item anyway, but then it's unreachable code
// BAD: the naive implementation of ref will create H(T) ref objects, but can be optimized to create only one
fun add(ref node : TreeNode, parent : TreeNode) : Boolean {
if (node == null) {
node = TreeNode(item, parent)
fun add(node : Ref<TreeNode?>, parent : TreeNode) : Boolean {
if (node[] == null) {
node[] = TreeNode(item, parent)
return true
}
when (compare(item, node.value)) {
when (compare(item, node[].value)) {
EQ -> false
LS -> add(ref node.left, node)
GT -> add(ref node.right, node)
LS -> add(ref node[].left, node)
GT -> add(ref node[].right, node)
}
}
+1 -1
View File
@@ -232,7 +232,7 @@ typeArguments
;
valueArguments
: "(" (SimpleName "=")? ("out" | "ref")? expression{","} ")"
: "(" (SimpleName "=")? expression{","} ")"
;
jump
+1 -1
View File
@@ -1,6 +1,6 @@
var x : Int = 1 + x
get() : Int = 1
set(<error>ref</error> value : <error>Long</error>) {
set(value : <error>Long</error>) {
$x = value.int
$x = <error>1.lng</error>
}