Skip to content

Commit

Permalink
Adding parser support for TIntersection reification
Browse files Browse the repository at this point in the history
  • Loading branch information
m0rkeulv committed Aug 31, 2024
1 parent 1e9aa32 commit 289c53a
Show file tree
Hide file tree
Showing 3 changed files with 170 additions and 20 deletions.
8 changes: 5 additions & 3 deletions src/main/java/com/intellij/plugins/haxe/lang/parser/haxe.bnf
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 : {} & {};

}


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand All @@ -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
Expand All @@ -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:}('}')

0 comments on commit 289c53a

Please sign in to comment.