From 191eb4ff08c73d4c8403c2633918cf17cd73634b Mon Sep 17 00:00:00 2001 From: Johannes Mey <johannes.mey@tu-dresden.de> Date: Sun, 24 Jan 2021 21:15:44 +0100 Subject: [PATCH] WIP --- src/main/grammar/JastAddAspect.bnf | 137 ++++++---- src/main/grammar/JastAddAspect.flex | 247 +++++++++++++----- .../aspect/JavaBlockLanguageInjector.java | 4 +- 3 files changed, 272 insertions(+), 116 deletions(-) diff --git a/src/main/grammar/JastAddAspect.bnf b/src/main/grammar/JastAddAspect.bnf index 8611058..256965b 100644 --- a/src/main/grammar/JastAddAspect.bnf +++ b/src/main/grammar/JastAddAspect.bnf @@ -11,11 +11,23 @@ elementTypeHolderClass="org.jastadd.tooling.aspect.psi.JastAddAspectTypes" elementTypeClass="org.jastadd.tooling.aspect.JastAddAspectElementType" tokenTypeClass="org.jastadd.tooling.aspect.JastAddAspectTokenType" + + tokens = [ + WhiteSpace = 'regexp:[ \t\n\r\f]' + SingleLineComment = 'regexp:[/][/] [^\n\r]* (\n | \r | \r\n)' + FormalComment = 'regexp:[/][*][*] [^*]* [*]+([^*/][^*]*[*]+)*[/]' + MultiLineComment = 'regexp:[/][*] [^*]+ [*]+([^*/][^*]*[*]+)*[/]' + + NotParenthesis = 'regexp:[^{}]+' + + MULTI_LINE_COMMENT = 'regexp:[/][*] [^*]+ [*]+([^*/][^*]*[*]+)*[/]' + FORMAL_COMMENT = 'regexp:[/][*][*] [^*]* [*]+([^*/][^*]*[*]+)*[/]' + SINGLE_LINE_COMMENT = 'regexp:[/][/] [^\n\r]* (\n | \r | \r\n)' + ] } -jastaddAspectFile ::= (aspect_declaration|comment)* -comment ::= (WHITESPACE | MULTILINECOMMENT | DOCCOMMENT | SINGLELINECOMMENT) + //attribute_equation ::= EQ java_block // @@ -25,7 +37,22 @@ comment ::= (WHITESPACE | MULTILINECOMMENT | DOCCOMMENT | SINGLELINECOMMENT) // extends="org.jastadd.tooling.aspect.psi.impl.JastAddAspectJavaBlockImplExtension" //} -aspect_declaration ::= ASPECT aspect_body +// aspect_body_declarations_eof ::= aspect_body_declaration* EOF + + +jastaddAspectFile ::= ( aspect_declaration | comment )* + +comment ::= (MULTILINECOMMENT | DOCCOMMENT | SINGLELINECOMMENT) + +compilation_unit ::= import_declaration* type_declaration* + +import_declaration ::= IMPORT STATIC? name (DOT STAR)? SEMICOLON + +modifiers ::= (PUBLIC | STATIC | PROTECTED | PRIVATE | FINAL | ABSTRACT | SYNCHRONIZED | NATIVE | TRANSIENT | VOLATILE | STRICTFP)* + +type_declaration ::= SEMICOLON | (modifiers ( class_declaration | interface_declaration | unmodified_enum_declaration | annotation_type_declaration | aspect_declaration ) ) + +aspect_declaration ::= ASPECT IDENTIFIER aspect_body aspect_body ::= LBRACE aspect_body_declaration* RBRACE @@ -50,13 +77,11 @@ aspect_body_declaration ::= ( aspect_refine_inh_equation | aspect_field_declaration | aspect_cache_declaration ) -aspect_body_declarations_eof ::= aspect_body_declaration* EOF +aspect_class_declaration ::= modifiers CLASS IDENTIFIER type_parameters (EXTENDS class_or_interface_type)? (IMPLEMENTS type_name_list)? aspect_class_body -aspect_class_declaration ::= modifiers CLASS id type_parameters (EXTENDS class_or_interface_type)? (IMPLEMENTS type_name_list)? aspect_class_body +aspect_class_body ::= class_body_declaration_in_paren // including curly braces -aspect_class_body ::= JAVA_CLASS_BODY_DECLARATION // including curly braces - -aspect_interface_declaration ::= modifiers INTERFACE id type_parameters? (EXTENDS type_name_list)? LBRACE aspect_interface_member_declaration* RBRACE +aspect_interface_declaration ::= modifiers INTERFACE IDENTIFIER type_parameters? (EXTENDS type_name_list)? LBRACE aspect_interface_member_declaration* RBRACE aspect_interface_member_declaration ::= ( aspect_nested_class_declaration | aspect_nested_interface_declaration @@ -65,62 +90,61 @@ aspect_interface_member_declaration ::= ( aspect_nested_class_declaration | aspect_interface_method_declaration | aspect_interface_field_declaration ) -aspect_interface_syn_attribute_declaration ::= annotation* SYN LAZY? FINAL? aspect_type attribute_name LPAREN (type ID (COMMA type ID)* )? RPAREN (CIRCULAR LBRACKET JAVA_EXPRESSION RBRACKET)? SCOL +aspect_interface_syn_attribute_declaration ::= annotation* SYN LAZY? FINAL? aspect_type attribute_name LPAREN (type IDENTIFIER (COMMA type IDENTIFIER)* )? RPAREN (CIRCULAR LBRACKET JAVA_EXPRESSION RBRACKET)? SEMICOLON -aspect_interface_inh_attribute_declaration ::= annotation* INH LAZY? FINAL? aspect_type attribute_name LPAREN (type ID (COMMA type ID)* )? RPAREN (CIRCULAR LBRACKET JAVA_EXPRESSION RBRACKET)? SCOL +aspect_interface_inh_attribute_declaration ::= annotation* INH LAZY? FINAL? aspect_type attribute_name LPAREN (type IDENTIFIER (COMMA type IDENTIFIER)* )? RPAREN (CIRCULAR LBRACKET JAVA_EXPRESSION RBRACKET)? SEMICOLON -aspect_interface_method_declaration ::= (PUBLIC | PROTECTED | PRIVATE | STATIC | ABSTRACT | FINAL | NATIVE | SYNCHRONIZED )* aspect_result_type method_declarator (THROWS name_list ) SCOL +aspect_interface_method_declaration ::= (PUBLIC | PROTECTED | PRIVATE | STATIC | ABSTRACT | FINAL | NATIVE | SYNCHRONIZED )* aspect_result_type method_declarator (THROWS name_list ) SEMICOLON -aspect_interface_field_declaration ::= modifiers aspect_type variable_declarator (COMMA variable_declarator)* SCOL +aspect_interface_field_declaration ::= modifiers aspect_type variable_declarator (COMMA variable_declarator)* SEMICOLON -aspect_nested_interface_declaration ::= modifiers INTERFACE ID type_parameters? EXTENDS? LBRACE JAVA_INTERFACE_MEMBER_DECLARATIONS RBRACE +aspect_nested_interface_declaration ::= modifiers INTERFACE IDENTIFIER type_parameters? EXTENDS? LBRACE JAVA_INTERFACE_MEMBER_DECLARATIONS RBRACE -aspect_nested_class_declaration ::= modifiers CLASS ID type_parameters? (EXTENDS class_or_interface_type)? (IMPLEMENTS type_name_list)? JAVA_CLASS_BODY_DECLARATION +aspect_nested_class_declaration ::= modifiers CLASS IDENTIFIER type_parameters? (EXTENDS class_or_interface_type)? (IMPLEMENTS type_name_list)? java_class_body_declaration -aspect_method_declaration ::= modifiers type_parameters? aspect_result_type ID DOT method_declarator (THROWS name_list)? (block | SCOL) +aspect_method_declaration ::= modifiers type_parameters? aspect_result_type IDENTIFIER DOT method_declarator (THROWS name_list)? (block | SEMICOLON) -aspect_refine_method_declaration ::= REFINE [ID] modifers type_parameters? aspect_result_type ID DOT method_declarator (THROWS name_list)? (block | SCOL) +aspect_refine_method_declaration ::= REFINE [IDENTIFIER] modifers type_parameters? aspect_result_type IDENTIFIER DOT method_declarator (THROWS name_list)? (block | SEMICOLON) -aspect_constructor_declaration ::= modifiers ID DOT ID formal_parameters (THROWS name_list)? LBRACE JAVA_EXPLICIT_CONSTRUCTUR_BLOCK RBRACE +aspect_constructor_declaration ::= modifiers IDENTIFIER DOT IDENTIFIER formal_parameters (THROWS name_list)? LBRACE JAVA_EXPLICIT_CONSTRUCTUR_BLOCK RBRACE -aspect_refine_constructor_declaration ::= REFINE ID (PUBLIC | PROTECTED | PRIVATE) ID DOT ID formal_parameters (THROWS name_list)? LBRACE block_statement* RBRACE +aspect_refine_constructor_declaration ::= REFINE IDENTIFIER (PUBLIC | PROTECTED | PRIVATE) IDENTIFIER DOT IDENTIFIER formal_parameters (THROWS name_list)? LBRACE block_statement* RBRACE -aspect_field_declaration ::= modifiers aspect_type ID DOT variable_declarator (COMMA variable_declarator)* SCOL +aspect_field_declaration ::= modifiers aspect_type IDENTIFIER DOT variable_declarator (COMMA variable_declarator)* SEMICOLON -aspect_syn_attribute_declaration ::= annotation* SYN NTA? LAZY? FINAL? aspect_type ID DOT attribute_name LPAREN type ID (COMMA type ID)* RPAREN (CIRCULAR LBRACKET JAVA_EXPRESSION RBRACKET)? ( EQ JAVA_EXPRESSION SCOL | block | SCOL ) +aspect_syn_attribute_declaration ::= annotation* SYN NTA? LAZY? FINAL? aspect_type IDENTIFIER DOT attribute_name LPAREN (type IDENTIFIER (COMMA type IDENTIFIER)* )? RPAREN (CIRCULAR LBRACKET JAVA_EXPRESSION RBRACKET)? ( ASSIGN JAVA_EXPRESSION SEMICOLON | block | SEMICOLON ) -aspect_inh_attribute_declaration ::= annotation* INH NTA? LAZY? FINAL? aspect_type ID DOT attribute_name LPAREN (type ID (COMMA type ID)* )? (CIRCULAR LBRACKET JAVA_EXPRESSION RBRACKET)? SCOL +aspect_inh_attribute_declaration ::= annotation* INH NTA? LAZY? FINAL? aspect_type IDENTIFIER DOT attribute_name LPAREN (type IDENTIFIER (COMMA type IDENTIFIER)* )? (CIRCULAR LBRACKET JAVA_EXPRESSION RBRACKET)? SEMICOLON -aspect_rewrite ::= REWRITE ID (ID DOT ID LPAREN RPAREN)? LBRACE ((WHEN LPAREN JAVA_EXPRESSION RPAREN)? TO aspect_type ( JAVA_EXPRESSION SCOL | block ))+ RBRACE +aspect_rewrite ::= REWRITE IDENTIFIER (IDENTIFIER DOT IDENTIFIER LPAREN RPAREN)? LBRACE ((WHEN LPAREN JAVA_EXPRESSION RPAREN)? TO aspect_type ( JAVA_EXPRESSION SEMICOLON | block ))+ RBRACE -aspect_syn_equation ::= annotation* ID DOT attribute_name LPAREN (type ID (COMMA type ID)*)? RPAREN ( EQ JAVA_EXPRESSION SCOL | block ) +aspect_syn_equation ::= annotation* EQUATION IDENTIFIER DOT attribute_name LPAREN (type IDENTIFIER (COMMA type IDENTIFIER)*)? RPAREN ( ASSIGN JAVA_EXPRESSION SEMICOLON | block ) -aspect_refine_syn_equation ::= REFINE ID EQ ID attribute_name LPAREN (type ID (COMMA type ID)*)? RPAREN (EQ JAVA_EXPRESSION SCOL | block) +aspect_refine_syn_equation ::= REFINE IDENTIFIER EQUATION IDENTIFIER attribute_name LPAREN (type IDENTIFIER (COMMA type IDENTIFIER)*)? RPAREN (ASSIGN JAVA_EXPRESSION SEMICOLON | block) -aspect_inh_equation ::= annotation* EQ ID DOT ID LPAREN (INT ID)? DOT attribute_name LPAREN (type ID (COMMA type ID)*)? RPAREN (EQ JAVA_EXPRESSION | block) +aspect_inh_equation ::= annotation* EQUATION IDENTIFIER DOT IDENTIFIER LPAREN (INT IDENTIFIER)? DOT attribute_name LPAREN (type IDENTIFIER (COMMA type IDENTIFIER)*)? RPAREN (ASSIGN JAVA_EXPRESSION | block) -aspect_refine_inh_equation ::= REFINE ID EQ ID DOT ID LPAREN (INT ID)? RPAREN DOT attribute_name LPAREN (type ID (COMMA type ID)*)? RPAREN (EQ JAVA_EXPRESSION | block) +aspect_refine_inh_equation ::= REFINE IDENTIFIER EQUATION IDENTIFIER DOT IDENTIFIER LPAREN (INT IDENTIFIER)? RPAREN DOT attribute_name LPAREN (type IDENTIFIER (COMMA type IDENTIFIER)*)? RPAREN (ASSIGN JAVA_EXPRESSION | block) -collection_attribute ::= annotation* COLL aspect_type ID DOT attribute_name LPAREN RPAREN CIRCULAR? (LBRACKET JAVA_EXPRESSION RBRACKET)? (WITH ID)? (ROOT ID)? SCOL +collection_attribute ::= annotation* COLL aspect_type IDENTIFIER DOT attribute_name LPAREN RPAREN CIRCULAR? (LBRACKET JAVA_EXPRESSION RBRACKET)? (WITH IDENTIFIER)? (ROOT IDENTIFIER)? SEMICOLON -collection_contribution ::= annotation* CONTRIBUTES ( NTA JAVA_EXPRESSION TO ID DOT attribute_name LPAREN RPAREN | EACH? JAVA_EXPRESSION (WHEN JAVA_EXPRESSION)? TO ID DOT attribute_name LPAREN RPAREN (FOR EACH? JAVA_EXPRESSION)? | block TO ID DOT attribute_name LPAREN RPAREN ) SCOL +collection_contribution ::= annotation* CONTRIBUTES ( NTA JAVA_EXPRESSION TO IDENTIFIER DOT attribute_name LPAREN RPAREN | EACH? JAVA_EXPRESSION (WHEN JAVA_EXPRESSION)? TO IDENTIFIER DOT attribute_name LPAREN RPAREN (FOR EACH? JAVA_EXPRESSION)? | block TO IDENTIFIER DOT attribute_name LPAREN RPAREN ) SEMICOLON -aspect_add_interface ::= IO IMPLEMENTS type_name_list SCOL +aspect_add_interface ::= IO IMPLEMENTS type_name_list SEMICOLON -aspect_extend_interface ::= ID EXTENDS type_name_list SCOL +aspect_extend_interface ::= IDENTIFIER EXTENDS type_name_list SEMICOLON // added type_name_list ::= class_or_interface_type (COMMA class_or_interface_type)* -attribute_name ::= ID +attribute_name ::= IDENTIFIER // TODO | UnmodifiedClassDeclaration("") -block_statement ::= (FINAL? type java_identifier local_variable_declaration SCOL) | statement +block_statement ::= (FINAL? type java_identifier local_variable_declaration SEMICOLON) | statement -aspect_cache_declaration ::= (CACHE | UNCACHE) ID DOT attribute_name LPAREN (type ID? (type ID?)* )? RPAREN SCOL +aspect_cache_declaration ::= (CACHE | UNCACHE) IDENTIFIER DOT attribute_name LPAREN (type IDENTIFIER? (type IDENTIFIER?)* )? RPAREN SEMICOLON -modifiers ::= (PUBLIC | STATIC | PROTECTED | PRIVATE | FINAL | ABSTRACT | SYNCHRONIZED | NATIVE | TRANSIENT | VOLATILE | STRICTFP)* // Attribute type names can not start with JastAdd reserved words such as 'syn', 'eq', etc. aspect_type ::= aspect_reference_type | ( primitive_type (LBRACKET RBRACKET)? ) @@ -133,35 +157,37 @@ formal_parameter ::= FINAL? type DOTS? variable_declarator_id variable_declarator_id ::= java_identifier ( LBRACKET RBRACKET )* -java_identifier ::= ID | INH | SYN | LAZY | REWRITE | TO | WHEN | ASPECT | EQUATION | CIRCULAR | REFINE | COLL | CONTRIBUTES | EACH | NTA | CACHE | UNCACHE +java_identifier ::= IDENTIFIER | INH | SYN | LAZY | REWRITE | TO | WHEN | ASPECT | EQUATION | CIRCULAR | REFINE | COLL | CONTRIBUTES | EACH | NTA | CACHE | UNCACHE -aspect_enum_declaration ::= modifiers ENUM ID (IMPLEMENTS type_name_list)? JAVA_ENUM_BODY +aspect_enum_declaration ::= modifiers ENUM IDENTIFIER (IMPLEMENTS type_name_list)? JAVA_ENUM_BODY -variable_declarator ::= variable_declarator_id ( EQ variable_initializer )? +variable_declarator ::= variable_declarator_id ( ASSIGN variable_initializer )? variable_initializer ::= array_initializer | expression array_initializer ::= LBRACE ( variable_initializer (COMMA variable_initializer)* )? RBRACE -primitive_type ::= boolean | char | byte | short | int | long | float | double +aspect_reference_type ::= aspect_class_or_interface_type (LBRACKET RBRACKET)* + +aspect_class_or_interface_type ::= IDENTIFIER type_arguments? (DOT java_identifier type_arguments? )* + +type ::= reference_type | primitive_type + +reference_type ::= ( primitive_type (LBRACKET RBRACKET)+ ) | ( class_or_interface_type (LBRACKET RBRACKET)* ) class_or_interface_type ::= java_identifier type_arguments? (DOT java_identifier type_arguments? )* -type_arguments ::= LESSTHAN (type_argument (COMMA type_argument)* )? MORETHAN +type_arguments ::= LT (type_argument (COMMA type_argument)* )? GT type_argument ::= reference_type | (QUESTIONMARK wildcard_bounds?) wildcard_bounds ::= (EXTENDS reference_type) | SUPER reference_type -reference_type ::= ( primitive_type (LBRACKET RBRACKET)+ ) | ( class_or_interface_type (LBRACKET RBRACKET)* ) - -aspect_reference_type ::= aspect_class_or_interface_type (LBRACKET RBRACKET)* - -aspect_class_or_interface_type ::= ID type_arguments? (DOT java_identifier type_arguments? )* +primitive_type ::= boolean | char | byte | short | int | long | float | double local_variable_declaration ::= FINAL? type variable_declarator (COMMA variable_declarator)* -type_parameters ::= LESSTHAN type_parameter (COMMA type_parameter)* GREATERTHAN +type_parameters ::= LT type_parameter (COMMA type_parameter)* GT type_parameter ::= java_identifier type_bound? @@ -171,3 +197,24 @@ aspect_result_type ::= VOID | aspect_type method_declarator ::= java_identifier formal_parameters (LBRACKET RBRACKET)* +annotation ::= ( normal_annotation | single_member_annotation | marker_annotation ) + +normal_annotation ::= AT name java_member_value_pairs_in_paren + +marker_annotation ::= AT name + +single_member_annotation ::= AT name java_member_value_in_paren + + + +// island things + +class_body_declaration_in_paren ::= JAVA_IN_PAREN +//{ +// implements="org.jastadd.tooling.aspect.psi.JastAddAspectJavaBlockExtension" +// extends="org.jastadd.tooling.aspect.psi.impl.JastAddAspectJavaBlockImplExtension" +//} + +java_member_value_in_paren ::= JAVA_IN_PAREN // LPAREN member_value RPAREN + +java_member_value_pairs_in_paren ::= JAVA_IN_PAREN // LPAREN member_value_pairs? RPAREN diff --git a/src/main/grammar/JastAddAspect.flex b/src/main/grammar/JastAddAspect.flex index 9f12d97..2120cab 100644 --- a/src/main/grammar/JastAddAspect.flex +++ b/src/main/grammar/JastAddAspect.flex @@ -19,87 +19,120 @@ import com.intellij.psi.TokenType; private int counter = 0; %} +WhiteSpace = [ \t\n\r\f] -WhiteSpace = [ ] | \t | \f | \n | \r | \r\n -//ID = [a-zA-Z$_][a-zA-Z0-9$_]* -//MultiLineComment = [/][*][^*]+[*]+([^*/][^*]*[*]+)*[/] -//DocComment = [/][*][*][^*]*[*]+([^*/][^*]*[*]+)*[/] -//SingleLineComment = [/][/] [^\n\r]* (\n | \r | \r\n) -NotParenthesis = [^{}]* +// TODO what is /**/ in Java? Is this caputered here? +SingleLineComment = "//" [^\n\r]* (\n | \r | \r\n) +FormalComment = "/**" [^*]* [*]+([^*/][^*]*[*]+)*[/] +MultiLineComment = "/*" [^*]+ [*]+([^*/][^*]*[*]+)*[/] -%state JAVA + +NotParenthesis = [^{}]+ + +// from jjt +// DecimalLiteral = [1-9] [0-9]* +// HexLiteral = 0 [xX] [0-9a-fA-F]+ +// OctalLiteral = 0 [0-7]* +// IntegerLiteral = ( {DecimalLiteral} | {HexLiteral} | {OctalLiteral} ) [lL]? + +Exponent = [eE] [+-]? [0-9]+ +FloatingPointLiteral = [0-9]+ "." [0-9]* {Exponent}? [fFdD]? + | "." [0-9]+ {Exponent}? [fFdD]? + | [0-9]+ {Exponent} [fFdD]? + | [0-9]+ {Exponent}? [fFdD] + +CharacterLiteral = ' ( [^'\\\n\r] | ( \\ ( [ntbrf\\'\"] | [0-7][0-7?] | [0-3][0-7][0-7] ) ) ) ' +StringLiteral = \" ( [^\"\\\n\r] | ( \\ ( [ntbrf\\'\"] | [0-7][0-7?] | [0-3][0-7][0-7] ) ) )* \" + +Identifier = [:jletter:] [:jletterdigit:]* + +%state JASTADD +%state EXPECT_JAVA_IN_PAREN +%state JAVA_IN_PAREN +%state COLLECTION_DECL %% <YYINITIAL> { - {WhiteSpace}+ {} - "EQ" { yybegin(YYINITIAL); return JastAddAspectTypes.EQ; } - "{" { yybegin(JAVA); counter = 1; } + {WhiteSpace}+ { return TokenType.WHITE_SPACE; } + {SingleLineComment} { return JastAddAspectTypes.SINGLE_LINE_COMMENT; } + {FormalComment} { return JastAddAspectTypes.FORMAL_COMMENT; } + {MultiLineComment} { return JastAddAspectTypes.MULTI_LINE_COMMENT; } +// "EQ" { yybegin(YYINITIAL); return JastAddAspectTypes.EQ; } +// "{" { yybegin(JAVA); counter = 1; } +} + +<EXPECT_JAVA_IN_PAREN> { + "{" { yybegin(JAVA_IN_PAREN); counter = 1; } } -<JAVA_PARENTHESIS_BLOCK> { +<JAVA_IN_PAREN> { + {SingleLineComment} {} + {FormalComment} {} + {MultiLineComment} {} + {CharacterLiteral} {} + {StringLiteral} {} {NotParenthesis} {} - "{" { counter++; yybegin(JAVA); } - "}" { counter--; if (counter==0) { yybegin(YYINITIAL); return JastAddAspectTypes.JAVABLOCK; } } + "{" { counter++; } + "}" { counter--; if (counter==0) { yybegin(YYINITIAL); return JastAddAspectTypes.JAVA_IN_PAREN; } } } -<JAVATOKENS> { - "abstract" { return JastAddAspectTypes.ABSTRACT; } - "assert" { return JastAddAspectTypes.ASSERT; } - "boolean" { return JastAddAspectTypes.BOOLEAN; } - "break" { return JastAddAspectTypes.BREAK; } - "byte" { return JastAddAspectTypes.BYTE; } - "case" { return JastAddAspectTypes.CASE; } - "catch" { return JastAddAspectTypes.CATCH; } - "char" { return JastAddAspectTypes.CHAR; } - "class" { return JastAddAspectTypes.CLASS; } - "const" { return JastAddAspectTypes.CONST; } - "continue" { return JastAddAspectTypes.CONTINUE; } - "default" { return JastAddAspectTypes._DEFAULT; } - "do" { return JastAddAspectTypes.DO; } - "double" { return JastAddAspectTypes.DOUBLE; } - "else" { return JastAddAspectTypes.ELSE; } - "enum" { return JastAddAspectTypes.ENUM; } - "extends" { return JastAddAspectTypes.EXTENDS; } - "false" { return JastAddAspectTypes.FALSE; } - "final" { return JastAddAspectTypes.FINAL; } - "finally" { return JastAddAspectTypes.FINALLY; } - "float" { return JastAddAspectTypes.FLOAT; } - "for" { return JastAddAspectTypes.FOR; } - "goto" { return JastAddAspectTypes.GOTO; } - "if" { return JastAddAspectTypes.IF; } - "implements" { return JastAddAspectTypes.IMPLEMENTS; } - "import" { return JastAddAspectTypes.IMPORT; } - "instanceof" { return JastAddAspectTypes.INSTANCEOF; } - "int" { return JastAddAspectTypes.INT; } - "interface" { return JastAddAspectTypes.INTERFACE; } - "long" { return JastAddAspectTypes.LONG; } - "native" { return JastAddAspectTypes.NATIVE; } - "new" { return JastAddAspectTypes.NEW; } - "null" { return JastAddAspectTypes.NULL; } - "package" { return JastAddAspectTypes.PACKAGE; } - "private" { return JastAddAspectTypes.PRIVATE; } - "protected" { return JastAddAspectTypes.PROTECTED; } - "public" { return JastAddAspectTypes.PUBLIC; } - "return" { return JastAddAspectTypes.RETURN; } - "short" { return JastAddAspectTypes.SHORT; } - "static" { return JastAddAspectTypes.STATIC; } - "strictfp" { return JastAddAspectTypes.STRICTFP; } - "super" { return JastAddAspectTypes.SUPER; } - "switch" { return JastAddAspectTypes.SWITCH; } - "synchronized" { return JastAddAspectTypes.SYNCHRONIZED; } - "this" { return JastAddAspectTypes.THIS; } - "throw" { return JastAddAspectTypes.THROW; } - "throws" { return JastAddAspectTypes.THROWS; } - "transient" { return JastAddAspectTypes.TRANSIENT; } - "true" { return JastAddAspectTypes.TRUE; } - "try" { return JastAddAspectTypes.TRY; } - "void" { return JastAddAspectTypes.VOID; } - "volatile" { return JastAddAspectTypes.VOLATILE; } - "while" { return JastAddAspectTypes.WHILE; } - - // JastAdd +<YYINITIAL,COLLECTION_DECL> { + "abstract" { return JastAddAspectTypes.ABSTRACT; } +//"assert" { return JastAddAspectTypes.ASSERT; } + "boolean" { return JastAddAspectTypes.BOOLEAN; } +//"break" { return JastAddAspectTypes.BREAK; } + "byte" { return JastAddAspectTypes.BYTE; } +//"case" { return JastAddAspectTypes.CASE; } +//"catch" { return JastAddAspectTypes.CATCH; } + "char" { return JastAddAspectTypes.CHAR; } + "class" { return JastAddAspectTypes.CLASS; } +//"const" { return JastAddAspectTypes.CONST; } +//"continue" { return JastAddAspectTypes.CONTINUE; } +//"default" { return JastAddAspectTypes._DEFAULT; } +//"do" { return JastAddAspectTypes.DO; } + "double" { return JastAddAspectTypes.DOUBLE; } +//"else" { return JastAddAspectTypes.ELSE; } + "enum" { return JastAddAspectTypes.ENUM; } + "extends" { return JastAddAspectTypes.EXTENDS; } +//"false" { return JastAddAspectTypes.FALSE; } + "final" { return JastAddAspectTypes.FINAL; } +//"finally" { return JastAddAspectTypes.FINALLY; } + "float" { return JastAddAspectTypes.FLOAT; } + "for" { return JastAddAspectTypes.FOR; } +//"goto" { return JastAddAspectTypes.GOTO; } +//"if" { return JastAddAspectTypes.IF; } + "implements" { return JastAddAspectTypes.IMPLEMENTS; } + "import" { return JastAddAspectTypes.IMPORT; } +//"instanceof" { return JastAddAspectTypes.INSTANCEOF; } + "int" { return JastAddAspectTypes.INT; } + "interface" { return JastAddAspectTypes.INTERFACE; } + "long" { return JastAddAspectTypes.LONG; } + "native" { return JastAddAspectTypes.NATIVE; } +//"new" { return JastAddAspectTypes.NEW; } +//"null" { return JastAddAspectTypes.NULL; } +//"package" { return JastAddAspectTypes.PACKAGE; } + "private" { return JastAddAspectTypes.PRIVATE; } + "protected" { return JastAddAspectTypes.PROTECTED; } + "public" { return JastAddAspectTypes.PUBLIC; } +//"return" { return JastAddAspectTypes.RETURN; } + "short" { return JastAddAspectTypes.SHORT; } + "static" { return JastAddAspectTypes.STATIC; } + "strictfp" { return JastAddAspectTypes.STRICTFP; } + "super" { return JastAddAspectTypes.SUPER; } +//"switch" { return JastAddAspectTypes.SWITCH; } + "synchronized" { return JastAddAspectTypes.SYNCHRONIZED; } +//"this" { return JastAddAspectTypes.THIS; } +//"throw" { return JastAddAspectTypes.THROW; } + "throws" { return JastAddAspectTypes.THROWS; } + "transient" { return JastAddAspectTypes.TRANSIENT; } +//"true" { return JastAddAspectTypes.TRUE; } +//"try" { return JastAddAspectTypes.TRY; } + "void" { return JastAddAspectTypes.VOID; } + "volatile" { return JastAddAspectTypes.VOLATILE; } +//"while" { return JastAddAspectTypes.WHILE; } + // JastAdd "inh" { return JastAddAspectTypes.INH; } "syn" { return JastAddAspectTypes.SYN; } "lazy" { return JastAddAspectTypes.LAZY; } @@ -115,4 +148,80 @@ NotParenthesis = [^{}]* "nta" { return JastAddAspectTypes.NTA; } "cache" { return JastAddAspectTypes.CACHE; } "uncache" { return JastAddAspectTypes.UNCACHE; } + + // TODO this is strangely split in another Token block, check semantics of JJTree file! + "coll" { yybegin(COLLECTION_DECL); return JastAddAspectTypes.COLL; } + } + +<COLLECTION_DECL> { + "with" { return JastAddAspectTypes.WITH; } + "root" { return JastAddAspectTypes.ROOT; } +} + +<YYINITIAL, COLLECTION_DECL> { + // LITERALS +//{IntegerLiteral} { return JastAddAspectTypes.INTEGER_LITERAL; } +//{FloatingPointLiteral} { return JastAddAspectTypes.FLOATING_POINT_LITERAL; } +//{CharacterLiteral} { return JastAddAspectTypes.CHARACTER_LITERAL; } +//{StringLiteral} { return JastAddAspectTypes.STRING_LITERAL; } + + // IDENTIFIERS + {Identifier} { return JastAddAspectTypes.IDENTIFIER; } + + // SEPARATORS + "(" { return JastAddAspectTypes.LPAREN; } + ")" { return JastAddAspectTypes.RPAREN; } + "{" { return JastAddAspectTypes.LBRACE; } + "}" { return JastAddAspectTypes.RBRACE; } + "[" { return JastAddAspectTypes.LBRACKET; } + "]" { return JastAddAspectTypes.RBRACKET; } + ";" { return JastAddAspectTypes.SEMICOLON; } + "," { return JastAddAspectTypes.COMMA; } + "." { return JastAddAspectTypes.DOT; } + "@" { return JastAddAspectTypes.AT; } + + // OPERATORS +//"=" { return JastAddAspectTypes.ASSIGN; } + "<" { return JastAddAspectTypes.LT; } +//"!" { return JastAddAspectTypes.BANG; } +//"~" { return JastAddAspectTypes.TILDE; } +//"?" { return JastAddAspectTypes.HOOK; } +//":" { return JastAddAspectTypes.COLON; } +//"==" { return JastAddAspectTypes.EQ; } +//"<=" { return JastAddAspectTypes.LE; } +//">=" { return JastAddAspectTypes.GE; } +//"!=" { return JastAddAspectTypes.NE; } +//"||" { return JastAddAspectTypes.SC_OR; } +//"&&" { return JastAddAspectTypes.SC_AND; } +//"++" { return JastAddAspectTypes.INCR; } +//"--" { return JastAddAspectTypes.DECR; } +//"+" { return JastAddAspectTypes.PLUS; } +//"-" { return JastAddAspectTypes.MINUS; } + "*" { return JastAddAspectTypes.STAR; } +//"/" { return JastAddAspectTypes.SLASH; } +//"&" { return JastAddAspectTypes.BIT_AND; } +//"|" { return JastAddAspectTypes.BIT_OR; } +//"^" { return JastAddAspectTypes.XOR; } +//"%" { return JastAddAspectTypes.REM; } +//"<<" { return JastAddAspectTypes.LSHIFT; } +//"+=" { return JastAddAspectTypes.PLUSASSIGN; } +//"-=" { return JastAddAspectTypes.MINUSASSIGN; } +//"*=" { return JastAddAspectTypes.STARASSIGN; } +//"/=" { return JastAddAspectTypes.SLASHASSIGN; } +//"&=" { return JastAddAspectTypes.ANDASSIGN; } +//"|=" { return JastAddAspectTypes.ORASSIGN; } +//"^=" { return JastAddAspectTypes.XORASSIGN; } +//"%=" { return JastAddAspectTypes.REMASSIGN; } +//"<<=" { return JastAddAspectTypes.LSHIFTASSIGN; } +//">>=" { return JastAddAspectTypes.RSIGNEDSHIFTASSIGN; } +//">>>=" { return JastAddAspectTypes.RUNSIGNEDSHIFTASSIGN; } +//"..." { return JastAddAspectTypes.ELLIPSIS; } +//"->" { return JastAddAspectTypes.ARROW; } +//"::" { return JastAddAspectTypes.DOUBLECOLON; } + + // TODO RUNSIGNEDSHIFT >>> and RSIGNEDSHIFT >> are not parsed + + ">" { return JastAddAspectTypes.GT; } +} + diff --git a/src/main/java/org/jastadd/tooling/aspect/JavaBlockLanguageInjector.java b/src/main/java/org/jastadd/tooling/aspect/JavaBlockLanguageInjector.java index 57c7317..c2a7cb9 100644 --- a/src/main/java/org/jastadd/tooling/aspect/JavaBlockLanguageInjector.java +++ b/src/main/java/org/jastadd/tooling/aspect/JavaBlockLanguageInjector.java @@ -6,7 +6,7 @@ import com.intellij.openapi.util.TextRange; import com.intellij.psi.InjectedLanguagePlaces; import com.intellij.psi.LanguageInjector; import com.intellij.psi.PsiLanguageInjectionHost; -import org.jastadd.tooling.aspect.psi.JastAddAspectJavaBlock; +import org.jastadd.tooling.aspect.psi.JastAddAspectClassBodyDeclarationInParen; import org.jetbrains.annotations.NotNull; public class JavaBlockLanguageInjector implements LanguageInjector { @@ -21,7 +21,7 @@ public class JavaBlockLanguageInjector implements LanguageInjector { */ @Override public void getLanguagesToInject(@NotNull PsiLanguageInjectionHost host, @NotNull InjectedLanguagePlaces injectionPlacesRegistrar) { - if (host.isValidHost() && host instanceof JastAddAspectJavaBlock) { + if (host.isValidHost() && host instanceof JastAddAspectClassBodyDeclarationInParen) { System.out.println(host.getText()); injectionPlacesRegistrar.addPlace(JavaLanguage.INSTANCE, new TextRange(0, host.getTextLength()), "class X { public void m(){", "}"); } -- GitLab