From 289c53ac49fd99fcec25daf8293b3cd9a1869376 Mon Sep 17 00:00:00 2001 From: m0rkeulv Date: Sat, 31 Aug 2024 20:38:54 +0200 Subject: [PATCH] Adding parser support for TIntersection reification --- .../plugins/haxe/lang/parser/haxe.bnf | 8 +- .../reification/BasicTypeReifications.hx | 6 + .../reification/BasicTypeReifications.txt | 176 ++++++++++++++++-- 3 files changed, 170 insertions(+), 20 deletions(-) diff --git a/src/main/java/com/intellij/plugins/haxe/lang/parser/haxe.bnf b/src/main/java/com/intellij/plugins/haxe/lang/parser/haxe.bnf index 5e8c39688..e5774d180 100644 --- a/src/main/java/com/intellij/plugins/haxe/lang/parser/haxe.bnf +++ b/src/main/java/com/intellij/plugins/haxe/lang/parser/haxe.bnf @@ -612,13 +612,15 @@ macroClassReification ::= 'macro' macroTopLevelDeclaration // type Reification private TPath ::= type private TFunction ::= arrowFunctionLiteral -private TAnonymous ::= anonymousTypeBody // TODO mlo: make a better expression +private TAnonymous ::= anonymousTypeBody private TParent ::= '(' type ')' -private TExtend ::= '{>' type ',' identifier ',' type '}' // TODO mlo: make a better expression +private TExtend ::= '{' extendedAnonymousTypeBody '}' private TOptional ::= '?' type +private TIntersection ::= TypeOrAnonymous ('&' TypeOrAnonymous)+ +private TypeOrAnonymous ::= anonymousTypeBody | type //OBS make sure ordering is correct -complexType ::= (TFunction | TAnonymous | TOptional | TParent | TExtend | TPath) +complexType ::= (TFunction | TOptional | TParent | TIntersection | TExtend | TAnonymous | TPath) macroTypeReification ::= 'macro' ':' complexType {pin=2} // macro statements can be used as "values" (ex. in method calls) and should not require ";" at the end diff --git a/src/test/resources/testData/parsing/haxe/statements/reification/BasicTypeReifications.hx b/src/test/resources/testData/parsing/haxe/statements/reification/BasicTypeReifications.hx index d5a9fb2b2..064bd78d2 100644 --- a/src/test/resources/testData/parsing/haxe/statements/reification/BasicTypeReifications.hx +++ b/src/test/resources/testData/parsing/haxe/statements/reification/BasicTypeReifications.hx @@ -26,6 +26,12 @@ class MacroTest { // ComplexType.TOptional var optional:ComplexType = macro : ?String; + //ComplexType.TIntersection + var intersectionA:ComplexType = macro : {a:String} & {b:String}; + var intersectionB:ComplexType = macro : MacroTest & {}; + var intersectionC:ComplexType = macro : $anon & {}; + var intersectionD:ComplexType = macro : {} & {}; + } diff --git a/src/test/resources/testData/parsing/haxe/statements/reification/BasicTypeReifications.txt b/src/test/resources/testData/parsing/haxe/statements/reification/BasicTypeReifications.txt index 06d4dbc99..c116b6bb0 100644 --- a/src/test/resources/testData/parsing/haxe/statements/reification/BasicTypeReifications.txt +++ b/src/test/resources/testData/parsing/haxe/statements/reification/BasicTypeReifications.txt @@ -152,6 +152,107 @@ Haxe File REFERENCE_EXPRESSION IDENTIFIER HaxePsiToken:ID('ComplexType') + VAR_INIT + HaxePsiToken:=('=') + VALUE_EXPRESSION + MACRO_TYPE_REIFICATION + HaxePsiToken:macro('macro') + HaxePsiToken::(':') + COMPLEX_TYPE + HaxePsiToken:{('{') + TYPE_EXTENDS_LIST + HaxePsiToken:>('>') + TYPE + REFERENCE_EXPRESSION + IDENTIFIER + HaxePsiToken:ID('Type') + HaxePsiToken:,(',') + ANONYMOUS_TYPE_FIELD_LIST + ANONYMOUS_TYPE_FIELD + COMPONENT_NAME + IDENTIFIER + HaxePsiToken:ID('field') + TYPE_TAG + HaxePsiToken::(':') + TYPE_OR_ANONYMOUS + TYPE + REFERENCE_EXPRESSION + IDENTIFIER + HaxePsiToken:ID('Type') + HaxePsiToken:}('}') + HaxePsiToken:;(';') + PsiComment(MSL_COMMENT)('// ComplexType.TParent') + LOCAL_VAR_DECLARATION_LIST + MUTABILITY_MODIFIER + HaxePsiToken:var('var') + LOCAL_VAR_DECLARATION + COMPONENT_NAME + IDENTIFIER + HaxePsiToken:ID('parent') + TYPE_TAG + HaxePsiToken::(':') + TYPE_OR_ANONYMOUS + TYPE + REFERENCE_EXPRESSION + IDENTIFIER + HaxePsiToken:ID('ComplexType') + VAR_INIT + HaxePsiToken:=('=') + VALUE_EXPRESSION + MACRO_TYPE_REIFICATION + HaxePsiToken:macro('macro') + HaxePsiToken::(':') + COMPLEX_TYPE + HaxePsiToken:(('(') + TYPE + REFERENCE_EXPRESSION + IDENTIFIER + HaxePsiToken:ID('Type') + HaxePsiToken:)(')') + HaxePsiToken:;(';') + PsiComment(MSL_COMMENT)('// ComplexType.TOptional') + LOCAL_VAR_DECLARATION_LIST + MUTABILITY_MODIFIER + HaxePsiToken:var('var') + LOCAL_VAR_DECLARATION + COMPONENT_NAME + IDENTIFIER + HaxePsiToken:ID('optional') + TYPE_TAG + HaxePsiToken::(':') + TYPE_OR_ANONYMOUS + TYPE + REFERENCE_EXPRESSION + IDENTIFIER + HaxePsiToken:ID('ComplexType') + VAR_INIT + HaxePsiToken:=('=') + VALUE_EXPRESSION + MACRO_TYPE_REIFICATION + HaxePsiToken:macro('macro') + HaxePsiToken::(':') + COMPLEX_TYPE + HaxePsiToken:?('?') + TYPE + REFERENCE_EXPRESSION + IDENTIFIER + HaxePsiToken:ID('String') + HaxePsiToken:;(';') + PsiComment(MSL_COMMENT)('//ComplexType.TIntersection') + LOCAL_VAR_DECLARATION_LIST + MUTABILITY_MODIFIER + HaxePsiToken:var('var') + LOCAL_VAR_DECLARATION + COMPONENT_NAME + IDENTIFIER + HaxePsiToken:ID('intersectionA') + TYPE_TAG + HaxePsiToken::(':') + TYPE_OR_ANONYMOUS + TYPE + REFERENCE_EXPRESSION + IDENTIFIER + HaxePsiToken:ID('ComplexType') VAR_INIT HaxePsiToken:=('=') VALUE_EXPRESSION @@ -161,35 +262,43 @@ Haxe File COMPLEX_TYPE ANONYMOUS_TYPE_BODY HaxePsiToken:{('{') - TYPE_EXTENDS_LIST - HaxePsiToken:>('>') - TYPE - REFERENCE_EXPRESSION + ANONYMOUS_TYPE_FIELD_LIST + ANONYMOUS_TYPE_FIELD + COMPONENT_NAME IDENTIFIER - HaxePsiToken:ID('Type') - HaxePsiToken:,(',') + HaxePsiToken:ID('a') + TYPE_TAG + HaxePsiToken::(':') + TYPE_OR_ANONYMOUS + TYPE + REFERENCE_EXPRESSION + IDENTIFIER + HaxePsiToken:ID('String') + HaxePsiToken:}('}') + HaxePsiToken:&('&') + ANONYMOUS_TYPE_BODY + HaxePsiToken:{('{') ANONYMOUS_TYPE_FIELD_LIST ANONYMOUS_TYPE_FIELD COMPONENT_NAME IDENTIFIER - HaxePsiToken:ID('field') + HaxePsiToken:ID('b') TYPE_TAG HaxePsiToken::(':') TYPE_OR_ANONYMOUS TYPE REFERENCE_EXPRESSION IDENTIFIER - HaxePsiToken:ID('Type') + HaxePsiToken:ID('String') HaxePsiToken:}('}') HaxePsiToken:;(';') - PsiComment(MSL_COMMENT)('// ComplexType.TParent') LOCAL_VAR_DECLARATION_LIST MUTABILITY_MODIFIER HaxePsiToken:var('var') LOCAL_VAR_DECLARATION COMPONENT_NAME IDENTIFIER - HaxePsiToken:ID('parent') + HaxePsiToken:ID('intersectionB') TYPE_TAG HaxePsiToken::(':') TYPE_OR_ANONYMOUS @@ -204,21 +313,22 @@ Haxe File HaxePsiToken:macro('macro') HaxePsiToken::(':') COMPLEX_TYPE - HaxePsiToken:(('(') TYPE REFERENCE_EXPRESSION IDENTIFIER - HaxePsiToken:ID('Type') - HaxePsiToken:)(')') + HaxePsiToken:ID('MacroTest') + HaxePsiToken:&('&') + ANONYMOUS_TYPE_BODY + HaxePsiToken:{('{') + HaxePsiToken:}('}') HaxePsiToken:;(';') - PsiComment(MSL_COMMENT)('// ComplexType.TOptional') LOCAL_VAR_DECLARATION_LIST MUTABILITY_MODIFIER HaxePsiToken:var('var') LOCAL_VAR_DECLARATION COMPONENT_NAME IDENTIFIER - HaxePsiToken:ID('optional') + HaxePsiToken:ID('intersectionC') TYPE_TAG HaxePsiToken::(':') TYPE_OR_ANONYMOUS @@ -233,11 +343,43 @@ Haxe File HaxePsiToken:macro('macro') HaxePsiToken::(':') COMPLEX_TYPE - HaxePsiToken:?('?') TYPE REFERENCE_EXPRESSION IDENTIFIER - HaxePsiToken:ID('String') + HaxePsiToken:MACRO_ID('$anon') + HaxePsiToken:&('&') + ANONYMOUS_TYPE_BODY + HaxePsiToken:{('{') + HaxePsiToken:}('}') + HaxePsiToken:;(';') + LOCAL_VAR_DECLARATION_LIST + MUTABILITY_MODIFIER + HaxePsiToken:var('var') + LOCAL_VAR_DECLARATION + COMPONENT_NAME + IDENTIFIER + HaxePsiToken:ID('intersectionD') + TYPE_TAG + HaxePsiToken::(':') + TYPE_OR_ANONYMOUS + TYPE + REFERENCE_EXPRESSION + IDENTIFIER + HaxePsiToken:ID('ComplexType') + VAR_INIT + HaxePsiToken:=('=') + VALUE_EXPRESSION + MACRO_TYPE_REIFICATION + HaxePsiToken:macro('macro') + HaxePsiToken::(':') + COMPLEX_TYPE + ANONYMOUS_TYPE_BODY + HaxePsiToken:{('{') + HaxePsiToken:}('}') + HaxePsiToken:&('&') + ANONYMOUS_TYPE_BODY + HaxePsiToken:{('{') + HaxePsiToken:}('}') HaxePsiToken:;(';') HaxePsiToken:}('}') HaxePsiToken:}('}') \ No newline at end of file