Skip to content

Commit 51cf578

Browse files
committed
Experimental BNF rewrite. Removing callOrArrayAccess(private) expression replacing it with valueReference expression(private). might improve performance and will hopefully cover all the same expressions.
1 parent 7143d54 commit 51cf578

File tree

2 files changed

+10
-19
lines changed
  • src
    • main/java/com/intellij/plugins/haxe/lang/parser
    • test/resources/testData/parsing/haxe/expressions

2 files changed

+10
-19
lines changed

src/main/java/com/intellij/plugins/haxe/lang/parser/haxe.bnf

+9-18
Original file line numberDiff line numberDiff line change
@@ -775,7 +775,7 @@ enumValueReference ::= simpleQualifiedReferenceExpression
775775
enumArgumentExtractor ::= enumValueReference '(' 'var'? enumExtractorArgumentList ')'
776776
{extends="expression" mixin="com.intellij.plugins.haxe.lang.psi.impl.HaxeEnumArgumentExtractorMixinImpl" implements="com.intellij.plugins.haxe.model.HaxeModelTarget"}
777777

778-
variableCaptureExpression ::= callOrArrayAccess ('=>' switchCaseExpr)+ {pin=2 extends="expression"}
778+
variableCaptureExpression ::= valueReference ('=>' switchCaseExpr)+ {pin=2 extends="expression"}
779779
private switchCaseCaptureInit ::= '=' (primitiveExtractedValue | expression) {extends = varInit }
780780
switchCaseCapture ::= <<startWithLowercaseOrUnderscoreCheck>> componentName (("=" extractorMatchExpressionVariant ) | switchCaseCaptureInit)
781781
{mixin="com.intellij.plugins.haxe.lang.psi.impl.HaxePsiFieldImpl" implements="com.intellij.plugins.haxe.lang.psi.HaxePsiField"}
@@ -882,7 +882,7 @@ fake unaryExpression ::= expression* operator {
882882
methods=[expression="expression[0]" operator="operator"]
883883
}
884884
// might not be the best solution to add (| thisExpression | superExpression | abstractExpression) here but it solves issues with postfix stuff (like "this.size++;")
885-
private assignableValueExpression ::= (referenceExpression | thisExpression | superExpression | abstractExpression) (qualifiedNullSafeReferenceExpression)* arrayAccessExpression*
885+
private assignableValueExpression ::= thisSuperAbstractOrReferenceExpression (qualifiedNullSafeReferenceExpression)* arrayAccessExpression*
886886

887887

888888
// Be careful when changing the ordering of the 'or' clauses here. It matters!!
@@ -903,20 +903,14 @@ private value ::= ('untyped' expression)
903903
| switchStatement
904904
| throwStatement
905905
| (castExpression qualifiedReferenceTail?)
906-
//
907906
| callFunctionLiteral
908907
| immediateArrayAccess
909-
| (macroExpressionReification (qualifiedReferenceTail | CallArrayOrReferenceExpression)?)
910908
| (literalExpression qualifiedReferenceTail?)
911909
| objectLiteral
912-
| callOrArrayAccess
913-
| parenthesizedExpressionOrCall // Seems redundant with callOrArrayAccess
910+
| valueReference
914911
| localVarDeclarationWithInit
915-
| referenceExpression
916-
| thisExpression
917-
| superExpression
918-
| abstractExpression
919912
{pin=1 }
913+
private valueReference ::= (macroExpressionReification | callOrArrayTail) (qualifiedReferenceTail | CallArrayOrReferenceExpression* qualifiedReferenceTail*)?;
920914

921915
literalExpression ::= LITINT | LITHEX | LITOCT | LITFLOAT
922916
| 'null' | 'true' | 'false'
@@ -945,25 +939,20 @@ private long_template_entry_recover ::= !(';' | OPEN_QUOTE| CLOSING_QUOTE | REGU
945939
regularExpressionLiteral ::= REG_EXP
946940
{extends="literalExpression" mixin="com.intellij.plugins.haxe.lang.psi.impl.HaxeRegularExpressionImpl" implements="com.intellij.plugins.haxe.lang.psi.HaxeRegularExpression"}
947941

948-
private parenthesizedExpressionOrCall ::= parenthesizedExpression qualifiedReferenceTail?
949942
parenthesizedExpression ::= '(' (typeCheckExpr | macroTypeReification | expression | statement) ')' {name="expression"}
950943

951944
private typeCheckOperator ::= ':'
952945
typeCheckExpr ::= expression typeCheckOperator typeWrapper
953946
{mixin="com.intellij.plugins.haxe.lang.psi.impl.HaxeClassReferenceImpl" implements="com.intellij.plugins.haxe.lang.psi.HaxeReference"}
954947

955-
private CallArrayOrReferenceExpression::= (callExpression | arrayAccessExpression |qualifiedReferenceExpression)
948+
private CallArrayOrReferenceExpression::= (callExpression | arrayAccessExpression |qualifiedNullSafeReferenceExpression)
956949
private newExpressionOrCall ::= newExpression qualifiedReferenceTail?
957950
private qualifiedReferenceTail ::= qualifiedNullSafeReferenceExpression CallArrayOrReferenceExpression*
958951

959-
960-
961952
private callFunctionLiteral ::= functionLiteral callExpression
962-
private callOrArrayAccess ::= (callAccess | arrayAccess )
963-
private callOrArrayTail ::= (referenceExpression | thisExpression | superExpression | abstractExpression | parenthesizedExpression)
964-
private callAccess ::= 'inline'? callOrArrayTail ( callExpression | arrayAccessExpression | qualifiedNullSafeReferenceExpression)*? callExpression
965-
private arrayAccess ::= callOrArrayTail ( callExpression | arrayAccessExpression | qualifiedNullSafeReferenceExpression)*? arrayAccessExpression
953+
private callOrArrayTail ::= ( thisSuperAbstractOrReferenceExpression | parenthesizedExpression)
966954
private immediateArrayAccess ::= arrayLiteral arrayAccessExpression
955+
967956
// spread operator only allowed as last last argument in calls expressions
968957
spreadExpression ::= (iteratorOperator (referenceExpression | arrayLiteral)) { extends = unaryExpression}
969958

@@ -976,6 +965,8 @@ left arrayAccessExpression ::= '[' expression ']'
976965
identifierOrReferenceAllowedKeyword ::= identifier | 'new'
977966
{extends= identifier}
978967

968+
private thisSuperAbstractOrReferenceExpression ::= referenceExpression | thisExpression | superExpression | abstractExpression
969+
979970
referenceExpression ::= identifier
980971
{mixin="com.intellij.plugins.haxe.lang.psi.impl.HaxeReferenceImpl" implements="com.intellij.plugins.haxe.lang.psi.HaxeReference"}
981972
left qualifiedNullSafeReferenceExpression ::= ('?.'|'.') identifierOrReferenceAllowedKeyword {elementType="referenceExpression" pin=2}

src/test/resources/testData/parsing/haxe/expressions/Offers.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ Haxe File
4444
HaxePsiToken:ID('toString')
4545
HaxePsiToken:(('(')
4646
HaxePsiToken:)(')')
47-
PsiErrorElement:<array access>, <expression>, <function call>, <operation>, <operator>, LONG_TEMPLATE_ENTRY_END or is expected, got '\'
47+
PsiErrorElement:<expression>, <operation>, <operator>, LONG_TEMPLATE_ENTRY_END or is expected, got '\'
4848
PsiElement(BAD_CHARACTER)('\')
4949
HaxePsiToken:ID('n')
5050
HaxePsiToken:LONG_TEMPLATE_ENTRY_END('}')

0 commit comments

Comments
 (0)