diff --git a/CHANGELOG.md b/CHANGELOG.md index 387da3def..40737b577 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -27,6 +27,7 @@ All notable changes to this project will be documented in this file. - #1636 Exception after search - traitslist with not properly set abc, other ui exception - Flash viewer- cyclic DefineSprite usage - #1570 Incorrect shape rendering when edge is reversed +- #1643 Separate AS1/2 and AS3 editor hilighting ### Removed - #1631 ActiveX Flash component download in windows installer diff --git a/lib/jsyntaxpane-0.9.5.jar b/lib/jsyntaxpane-0.9.5.jar index 0c9854a3f..2c434e447 100644 Binary files a/lib/jsyntaxpane-0.9.5.jar and b/lib/jsyntaxpane-0.9.5.jar differ diff --git a/libsrc/jsyntaxpane/jsyntaxpane/src/main/java/jsyntaxpane/syntaxkits/ActionScript3SyntaxKit.java b/libsrc/jsyntaxpane/jsyntaxpane/src/main/java/jsyntaxpane/syntaxkits/ActionScript3SyntaxKit.java new file mode 100644 index 000000000..c89039dc2 --- /dev/null +++ b/libsrc/jsyntaxpane/jsyntaxpane/src/main/java/jsyntaxpane/syntaxkits/ActionScript3SyntaxKit.java @@ -0,0 +1,33 @@ +/* + * Copyright 2008 Ayman Al-Sairafi ayman.alsairafi@gmail.com + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License + * at http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package jsyntaxpane.syntaxkits; + +import jsyntaxpane.DefaultSyntaxKit; +import jsyntaxpane.Lexer; +import jsyntaxpane.lexers.ActionScript3Lexer; + +/** + * + * @author JPEXS + */ +public class ActionScript3SyntaxKit extends DefaultSyntaxKit { + + public ActionScript3SyntaxKit() { + super(new ActionScript3Lexer()); + } + + ActionScript3SyntaxKit(Lexer lexer) { + super(lexer); + } +} diff --git a/libsrc/jsyntaxpane/jsyntaxpane/src/main/jflex/jsyntaxpane/lexers/actionscript.flex b/libsrc/jsyntaxpane/jsyntaxpane/src/main/jflex/jsyntaxpane/lexers/actionscript.flex index 21d9345fb..51b9bfffc 100644 --- a/libsrc/jsyntaxpane/jsyntaxpane/src/main/jflex/jsyntaxpane/lexers/actionscript.flex +++ b/libsrc/jsyntaxpane/jsyntaxpane/src/main/jflex/jsyntaxpane/lexers/actionscript.flex @@ -105,16 +105,6 @@ SlashVariable = {Path} ":" {Identifier} IdentifierNs = {Identifier} ":" {Identifier} -TypeNameSpec = ".<" {Identifier} ">" - -/* XML */ -LetterColon = [:jletter] | ":" -XMLIdentifier = {Identifier} | {IdentifierNs} -XMLAttribute = " "* {XMLIdentifier} " "* "=" " "* \" {InputCharacter}* \" " "* -XMLBeginOneTag = "<" {XMLIdentifier} {XMLAttribute}* ">" -XMLBeginTag = "<" {XMLIdentifier} " " -XMLEndTag = "" - /* integer literals */ DecIntegerLiteral = 0 | [1-9][0-9]* @@ -312,24 +302,7 @@ RegExp = \/([^\r\n/]|\\\/)+\/[a-z]* {Comment} { return token(TokenType.COMMENT); } /* whitespace */ - {WhiteSpace} { } - {TypeNameSpec} { return token(TokenType.IDENTIFIER); } - {XMLBeginOneTag} { yybegin(XML); - tokenStart = yychar; - tokenLength = yylength(); - String s=yytext(); - s=s.substring(1,s.length()-1); - if(s.contains(" ")){ - s=s.substring(0,s.indexOf(" ")); - } - xmlTagName = s; - } - /*{XMLBeginTag} { yybegin(XMLSTARTTAG); - tokenStart = yychar; - tokenLength = yylength(); - String s=yytext(); - xmlTagName = s.substring(1); - }*/ + {WhiteSpace} { } /* identifiers */ {SlashVariable} { return token(TokenType.IDENTIFIER); } {Identifier}{NamespaceSuffix} { return token(TokenType.REGEX); } @@ -337,24 +310,6 @@ RegExp = \/([^\r\n/]|\\\/)+\/[a-z]* } - { - {XMLAttribute} { tokenLength += yylength();} - {WhiteSpace} { tokenLength += yylength(); } - ">" { yybegin(XML); tokenLength += yylength();} -} - { - {XMLBeginOneTag} { tokenLength += yylength();} - {XMLEndTag} { tokenLength += yylength(); - String endtagname=yytext(); - endtagname=endtagname.substring(2,endtagname.length()-1); - if(endtagname.equals(xmlTagName)){ - yybegin(YYINITIAL); - return token(TokenType.STRING, tokenStart, tokenLength); - } - } - .|\n { tokenLength += yylength(); } -} - { \" { yybegin(YYINITIAL); diff --git a/libsrc/jsyntaxpane/jsyntaxpane/src/main/jflex/jsyntaxpane/lexers/actionscript3.flex b/libsrc/jsyntaxpane/jsyntaxpane/src/main/jflex/jsyntaxpane/lexers/actionscript3.flex new file mode 100644 index 000000000..ef37e8af7 --- /dev/null +++ b/libsrc/jsyntaxpane/jsyntaxpane/src/main/jflex/jsyntaxpane/lexers/actionscript3.flex @@ -0,0 +1,412 @@ +/* + * Copyright 2008 Ayman Al-Sairafi ayman.alsairafi@gmail.com + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License + * at http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package jsyntaxpane.lexers; + + +import jsyntaxpane.Token; +import jsyntaxpane.TokenType; +import javax.swing.text.Segment; +import java.io.CharArrayReader; +import java.io.IOException; +import java.util.logging.Logger; +import java.util.logging.Level; +import java.util.List; +%% + +%public +%class ActionScript3Lexer +%extends DefaultJFlexLexer +%final +%unicode +%char +%type Token + + +%{ + /** + * Create an empty lexer, yyreset will be called later to reset and assign + * the reader + */ + public ActionScript3Lexer() { + super(); + } + + @Override + public int yychar() { + return yychar; + } + + private static final byte PARAN = 1; + private static final byte BRACKET = 2; + private static final byte CURLY = 3; + + private static String xmlTagName=""; + + private Token prevToken = null; + + @Override + public void parse(Segment segment, int ofst, List tokens) { + try { + CharArrayReader reader = new CharArrayReader(segment.array, segment.offset, segment.count); + yyreset(reader); + this.offset = ofst; + prevToken = null; + Token t = yylex(); + prevToken = t; + for (; t != null; t = yylex()) { + prevToken = t; + tokens.add(t); + } + } catch (IOException ex) { + Logger.getLogger(DefaultJFlexLexer.class.getName()).log(Level.SEVERE, null, ex); + } + } + +%} + +/* main character classes */ +LineTerminator = \r|\n|\r\n +InputCharacter = [^\r\n] + +WhiteSpace = {LineTerminator} | [ \t\f]+ + +/* comments */ +Comment = {TraditionalComment} | {EndOfLineComment} + +TraditionalComment = "/*" [^*] ~"*/" | "/*" "*"+ "/" +EndOfLineComment = "//" {InputCharacter}* {LineTerminator}? + +IdentFirst = [\p{Lu}\p{Ll}\p{Lt}\p{Lm}\p{Lo}_$] +IdentNext = {IdentFirst} | [\p{Nl}\p{Mn}\p{Mc}\p{Nd}\p{Pc}] + + +/* identifiers */ +Identifier = {IdentFirst}{IdentNext}* + +IdentifierOrParent = {Identifier} | ".." + +Path = "/" | "/"? {IdentifierOrParent} ("/" {IdentifierOrParent})* "/"? + +/* identifiers */ + +IdentifierNs = {Identifier} ":" {Identifier} + +TypeNameSpec = ".<" {Identifier} ">" + +/* XML */ +LetterColon = [:jletter] | ":" +XMLIdentifier = {Identifier} | {IdentifierNs} +XMLAttribute = " "* {XMLIdentifier} " "* "=" " "* \" {InputCharacter}* \" " "* +XMLBeginOneTag = "<" {XMLIdentifier} {XMLAttribute}* ">" +XMLBeginTag = "<" {XMLIdentifier} " " +XMLEndTag = "" + +/* integer literals */ +DecIntegerLiteral = 0 | [1-9][0-9]* + +HexIntegerLiteral = 0 [xX] 0* {HexDigit} {1,8} +HexDigit = [0-9a-fA-F] + +OctIntegerLiteral = 0+ [1-3]? {OctDigit} {1,15} +OctDigit = [0-7] + +/* floating point literals */ +DoubleLiteral = ({FLit1}|{FLit2}|{FLit3}) {Exponent}? + +FLit1 = [0-9]+ \. [0-9]* +FLit2 = \. [0-9]+ +FLit3 = [0-9]+ +Exponent = [eE] [+-]? [0-9]+ + +NewVector = "new" {WhiteSpace}* "<" + +/* string and character literals */ +StringCharacter = [^\r\n\"\\] +SingleCharacter = [^\r\n\'\\] + +OIdentifierCharacter = [^\r\n\u00A7\\] +Preprocessor = \u00A7\u00A7 {Identifier} + +NamespaceSuffix = "#" {DecIntegerLiteral} + +RegExp = \/([^\r\n/]|\\\/)+\/[a-z]* + +%state STRING, CHARLITERAL, XMLSTARTTAG, XML, OIDENTIFIER + +%% + + { + + /* keywords */ + "break" | + "case" | + "continue" | + "default" | + "do" | + "while" | + "else" | + "for" | + "each" | + "in" | + "if" | + "label" | + "return" | + "super" | + "switch" | + "throw" | + "try" | + "catch" | + "finally" | + "while" | + "with" | + "dynamic" | + "final" | + "internal" | + "native" | + "override" | + "private" | + "protected" | + "public" | + "static" | + "class" | + "const" | + "extends" | + "function" | + "get" | + "implements" | + "interface" | + "namespace" | + "package" | + "set" | + "var" | + "import" | + "include" | + "use" | + "false" | + "null" | + "this" | + "true" { return token(TokenType.KEYWORD); } + + + {RegExp} { + if (prevToken == null || (prevToken.type == TokenType.OPERATOR && prevToken.pairValue >= 0)) { + return token(TokenType.REGEX); + } else { + int ch = yychar; + yypushback(yylength()-1); + // divide "/" operator + return token(TokenType.OPERATOR,ch,1); + } + } + + /* operators */ + + "(" { return token(TokenType.OPERATOR, PARAN); } + ")" { return token(TokenType.OPERATOR, -PARAN); } + "{" { return token(TokenType.OPERATOR, CURLY); } + "}" { return token(TokenType.OPERATOR, -CURLY); } + "[" { return token(TokenType.OPERATOR, BRACKET); } + "]" { return token(TokenType.OPERATOR, -BRACKET); } + ";" | + "," | + "..." | + "." | + "=" | + ">" | + "<" | + "!" | + "~" | + "?" | + ":" | + "==" | + "<=" | + ">=" | + "!=" | + "&&" | + "||" | + "++" | + "--" | + "+" | + "-" | + "*" | + "/" | + "&" | + "|" | + "^" | + "%" | + "<<" | + ">>" | + ">>>" | + "+=" | + "-=" | + "*=" | + "/=" | + "&=" | + "|=" | + "^=" | + "%=" | + "<<=" | + ">>=" | + ">>>=" | + "as" | + "delete" | + "instanceof" | + "is" | + "::" | + "new" | + "typeof" | + "void" | + {NewVector} | + "@" { return token(TokenType.OPERATOR); } + + /* string literal */ + \" { + yybegin(STRING); + tokenStart = yychar; + tokenLength = 1; + } + {Preprocessor} { + return token(TokenType.ERROR); + } + "\u00A7" { + yybegin(OIDENTIFIER); + tokenStart = yychar; + tokenLength = 1; + } + + /* character literal */ + \' { + yybegin(CHARLITERAL); + tokenStart = yychar; + tokenLength = 1; + } + + /* numeric literals */ + + {DecIntegerLiteral} | + + {HexIntegerLiteral} | + + {OctIntegerLiteral} | + + {DoubleLiteral} | + {DoubleLiteral}[dD] { return token(TokenType.NUMBER); } + + // JavaDoc comments need a state so that we can highlight the @ controls + + /* comments */ + {Comment} { return token(TokenType.COMMENT); } + + /* whitespace */ + {WhiteSpace} { } + {TypeNameSpec} { return token(TokenType.IDENTIFIER); } + {XMLBeginOneTag} { yybegin(XML); + tokenStart = yychar; + tokenLength = yylength(); + String s=yytext(); + s=s.substring(1,s.length()-1); + if(s.contains(" ")){ + s=s.substring(0,s.indexOf(" ")); + } + xmlTagName = s; + } + /*{XMLBeginTag} { yybegin(XMLSTARTTAG); + tokenStart = yychar; + tokenLength = yylength(); + String s=yytext(); + xmlTagName = s.substring(1); + }*/ + /* identifiers */ + {Identifier}{NamespaceSuffix} { return token(TokenType.REGEX); } + {Identifier} { return token(TokenType.IDENTIFIER); } + +} + + { + {XMLAttribute} { tokenLength += yylength();} + {WhiteSpace} { tokenLength += yylength(); } + ">" { yybegin(XML); tokenLength += yylength();} +} + { + {XMLBeginOneTag} { tokenLength += yylength();} + {XMLEndTag} { tokenLength += yylength(); + String endtagname=yytext(); + endtagname=endtagname.substring(2,endtagname.length()-1); + if(endtagname.equals(xmlTagName)){ + yybegin(YYINITIAL); + return token(TokenType.STRING, tokenStart, tokenLength); + } + } + .|\n { tokenLength += yylength(); } +} + + { + \" { + yybegin(YYINITIAL); + // length also includes the trailing quote + return token(TokenType.STRING, tokenStart, tokenLength + 1); + } + + {StringCharacter}+ { tokenLength += yylength(); } + + \\[0-3]?{OctDigit}?{OctDigit} { tokenLength += yylength(); } + + /* escape sequences */ + + \\. { tokenLength += 2; } + {LineTerminator} { yybegin(YYINITIAL); } +} + + { + "\u00A7" {NamespaceSuffix} { + yybegin(YYINITIAL); + // length also includes the trailing quote + namespace suffix + return token(TokenType.REGEX, tokenStart, tokenLength + yylength()); + } + + "\u00A7" { + yybegin(YYINITIAL); + // length also includes the trailing quote + return token(TokenType.REGEX, tokenStart, tokenLength + 1); + } + + {OIdentifierCharacter}+ { tokenLength += yylength(); } + + + /* escape sequences */ + + \\. { tokenLength += 2; } + {LineTerminator} { yybegin(YYINITIAL); } +} + + { + \' { + yybegin(YYINITIAL); + // length also includes the trailing quote + return token(TokenType.STRING, tokenStart, tokenLength + 1); + } + + {SingleCharacter}+ { tokenLength += yylength(); } + + /* escape sequences */ + + \\. { tokenLength += 2; } + {LineTerminator} { yybegin(YYINITIAL); } +} + +/* error fallback */ +[^] { } +<> { return null; } + diff --git a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/kitsfortypes.properties b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/kitsfortypes.properties index d1b2d413c..ab9b02f62 100644 --- a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/kitsfortypes.properties +++ b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/kitsfortypes.properties @@ -28,4 +28,5 @@ text/flasm3=jsyntaxpane.syntaxkits.Flasm3SyntaxKit text/flasm3methodinfo=jsyntaxpane.syntaxkits.Flasm3MethodInfoSyntaxKit text/flasm=jsyntaxpane.syntaxkits.FlasmSyntaxKit text/actionscript=jsyntaxpane.syntaxkits.ActionScriptSyntaxKit +text/actionscript3=jsyntaxpane.syntaxkits.ActionScript3SyntaxKit text/swftext=jsyntaxpane.syntaxkits.SWFTextSyntaxKit \ No newline at end of file diff --git a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/actionscript3syntaxkit/config.properties b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/actionscript3syntaxkit/config.properties new file mode 100644 index 000000000..51fb2995e --- /dev/null +++ b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/actionscript3syntaxkit/config.properties @@ -0,0 +1,23 @@ +# +# ActionScript +# + +Components = jsyntaxpane.components.PairsMarker, jsyntaxpane.components.LineNumbersBreakpointsRuler + +Action.indent.WordRegex=\\w+|\\/(\\*)+ +Action.parenthesis = jsyntaxpane.actions.PairAction, typed ( +Action.brackets = jsyntaxpane.actions.PairAction, typed [ +Action.quotes = jsyntaxpane.actions.PairAction, typed ' +Action.double-quotes = jsyntaxpane.actions.PairAction, typed " +Action.close-curly = jsyntaxpane.actions.JUnindentAction, typed } + +PopupMenu = \ + ${DEFAULT_EDIT_MENU} , \ + - , \ + indent , \ + unindent , \ + - , \ + toggle-comments , \ + - , \ + toggle-lines + diff --git a/src/com/jpexs/decompiler/flash/gui/abc/ABCPanel.java b/src/com/jpexs/decompiler/flash/gui/abc/ABCPanel.java index 730d7b230..47fc02408 100644 --- a/src/com/jpexs/decompiler/flash/gui/abc/ABCPanel.java +++ b/src/com/jpexs/decompiler/flash/gui/abc/ABCPanel.java @@ -1006,7 +1006,7 @@ public class ABCPanel extends JPanel implements ItemListener, SearchListener