692 expression |
692 expression |
693 | node savedLastSelectorElement | |
693 | node savedLastSelectorElement | |
694 |
694 |
695 savedLastSelectorElement := lastSelectorElement. |
695 savedLastSelectorElement := lastSelectorElement. |
696 lastSelectorElement := nil. |
696 lastSelectorElement := nil. |
|
697 |
697 node := super expression. |
698 node := super expression. |
698 ((node ~~ #Error) and:[node isMessage]) ifTrue:[ |
699 ((node ~~ #Error) and:[node isMessage]) ifTrue:[ |
699 [ lastSelectorElement notNil ] whileTrue:[ |
700 [ lastSelectorElement notNil ] whileTrue:[ |
700 lastSelectorElement node parent: node. |
701 lastSelectorElement node parent: node. |
701 lastSelectorElement := lastSelectorElement prev. |
702 lastSelectorElement := lastSelectorElement previousElement. |
702 ]. |
703 ]. |
703 ]. |
704 ]. |
704 lastSelectorElement := savedLastSelectorElement. |
705 lastSelectorElement := savedLastSelectorElement. |
705 ^node |
706 ^node |
706 |
707 |
918 "Created: / 16-02-2012 / 23:50:17 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
919 "Created: / 16-02-2012 / 23:50:17 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
919 ! ! |
920 ! ! |
920 |
921 |
921 !SyntaxHighlighter2 methodsFor:'syntax detection'! |
922 !SyntaxHighlighter2 methodsFor:'syntax detection'! |
922 |
923 |
|
924 markBlockArgumentIdentifierFrom:pos1 to:pos2 |
|
925 "in addition to marking, remember the variable reference" |
|
926 |
|
927 | node | |
|
928 |
|
929 super markBlockArgumentIdentifierFrom:pos1 to:pos2. |
|
930 |
|
931 node := VariableNode blockArgumentNamed:(sourceText string copyFrom: pos1 to: pos2). |
|
932 node block:currentBlock. |
|
933 self rememberVariableElementFor: node from:pos1 to:pos2 assigned:false |
|
934 ! |
|
935 |
923 markLocalVariableDeclaration: name from:pos1 to:pos2 |
936 markLocalVariableDeclaration: name from:pos1 to:pos2 |
|
937 "in addition to marking, remember the variable reference" |
|
938 |
924 | type node | |
939 | type node | |
925 |
940 |
926 super markLocalVariableDeclaration: name from:pos1 to:pos2. |
941 super markLocalVariableDeclaration: name from:pos1 to:pos2. |
927 |
942 |
928 type := currentBlock notNil ifTrue:[#BlockVariable] ifFalse:[#MethodVariable]. |
943 type := currentBlock notNil ifTrue:[#BlockVariable] ifFalse:[#MethodVariable]. |
929 node := VariableNode type: type name: name. |
944 node := VariableNode type: type name: name. |
930 node startPosition: pos1 endPosition: pos2. |
945 node block:currentBlock. "/ which is nil for method locals |
931 self rememberVariableElementFor: node from: pos1 to: pos2 assigned: false. |
946 self rememberVariableElementFor: node from: pos1 to: pos2 assigned: false. |
932 |
947 |
933 "Created: / 25-02-2014 / 20:22:56 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
948 "Created: / 25-02-2014 / 20:22:56 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
934 ! |
949 ! |
935 |
950 |
936 markMethodArgumentIdentifierFrom:pos1 to:pos2 |
951 markMethodArgumentIdentifierFrom:pos1 to:pos2 |
|
952 "in addition to marking, remember the variable reference" |
|
953 |
937 | node | |
954 | node | |
938 |
955 |
939 super markMethodArgumentIdentifierFrom:pos1 to:pos2. |
956 super markMethodArgumentIdentifierFrom:pos1 to:pos2. |
940 |
957 |
941 node := VariableNode methodArgumentNamed:(sourceText string copyFrom: pos1 to: pos2). |
958 node := VariableNode methodArgumentNamed:(sourceText string copyFrom: pos1 to: pos2). |
942 node startPosition: pos1 endPosition: pos2. |
|
943 self rememberVariableElementFor: node from:pos1 to:pos2 assigned:false |
959 self rememberVariableElementFor: node from:pos1 to:pos2 assigned:false |
944 |
960 |
945 "Created: / 24-07-2010 / 09:25:12 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
961 "Created: / 24-07-2010 / 09:25:12 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
946 "Modified: / 21-08-2011 / 09:27:26 / cg" |
962 "Modified: / 21-08-2011 / 09:27:26 / cg" |
947 "Modified: / 25-02-2014 / 12:15:59 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
963 "Modified: / 25-02-2014 / 12:15:59 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
953 |
969 |
954 "Special hack for Java class references - I would like to have them |
970 "Special hack for Java class references - I would like to have them |
955 marked specially (and not as an error when the class is not yet loaded - |
971 marked specially (and not as an error when the class is not yet loaded - |
956 the code is correct as JavaClassAccessor loads it lazily" |
972 the code is correct as JavaClassAccessor loads it lazily" |
957 (aReceiverNode isJavaPackageReference) ifTrue:[ |
973 (aReceiverNode isJavaPackageReference) ifTrue:[ |
958 self |
974 self |
959 markFrom:pos1 to:pos2 |
975 markFrom:pos1 to:pos2 |
960 withEmphasis:preferences globalClassIdentifierEmphasis |
976 withEmphasis:preferences globalClassIdentifierEmphasis |
961 color: preferences globalClassIdentifierColor |
977 color: preferences globalClassIdentifierColor |
962 ] ifFalse:[ |
978 ] ifFalse:[ |
963 super markSelector:selectorString from:pos1 to:pos2 receiverNode:aReceiverNode. |
979 super markSelector:selectorString from:pos1 to:pos2 receiverNode:aReceiverNode. |
964 ]. |
980 ]. |
965 |
981 |
966 "don't create symbols for partial typed selectors" |
982 "don't create symbols for partial typed selectors" |
967 selectorSymbol := selectorString asSymbolIfInterned. |
983 selectorSymbol := selectorString asSymbolIfInterned. |
968 |
984 |
969 element := elements newElementFor: (SelectorNode value: selectorString from: pos1 to: pos2). |
985 element := elements newElementFor: (SelectorNode value: selectorString from: pos1 to: pos2). |
970 |
986 |
971 (lastSelectorElement notNil "and:[lastSelectorElement value = selectorString]") ifTrue:[ |
987 (lastSelectorElement notNil "and:[lastSelectorElement value = selectorString]") ifTrue:[ |
972 lastSelectorElement next: element. |
988 lastSelectorElement nextElement: element. |
973 ]. |
989 ]. |
974 elements add: element. |
990 elements add: element. |
975 lastSelectorElement := "(self isValidUnarySelector:tokenType)"false |
991 lastSelectorElement := "(self isValidUnarySelector:tokenType)"false |
976 ifTrue:[nil] |
992 ifTrue:[nil] |
977 ifFalse:[element]. |
993 ifFalse:[element]. |
978 |
994 |
979 "Created: / 14-02-2010 / 17:40:09 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
995 "Created: / 14-02-2010 / 17:40:09 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
980 "Modified: / 14-02-2010 / 19:24:17 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
996 "Modified: / 14-02-2010 / 19:24:17 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
981 "Modified (format): / 21-08-2011 / 09:18:21 / cg" |
997 "Modified (format): / 21-08-2011 / 09:18:21 / cg" |
982 "Modified: / 19-04-2012 / 09:53:59 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
998 "Modified: / 19-04-2012 / 09:53:59 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
983 ! |
999 ! |
984 |
1000 |
985 markSelfFrom:pos1 to:pos2 |
1001 markSelfFrom:pos1 to:pos2 |
|
1002 "in addition to marking, remember the variable reference" |
|
1003 |
986 | node | |
1004 | node | |
987 |
1005 |
988 super markSelfFrom:pos1 to:pos2. |
1006 super markSelfFrom:pos1 to:pos2. |
989 |
1007 |
990 node := SelfNode new. |
1008 node := SelfNode new. |
991 node startPosition: pos1 endPosition: pos2. |
|
992 node type: #Self. |
1009 node type: #Self. |
993 self rememberVariableElementFor: node from:pos1 to:pos2 assigned:false |
1010 self rememberVariableElementFor: node from:pos1 to:pos2 assigned:false |
994 |
1011 |
995 "Created: / 21-08-2011 / 09:15:45 / cg" |
1012 "Created: / 21-08-2011 / 09:15:45 / cg" |
996 "Modified: / 25-02-2014 / 21:56:47 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
1013 "Modified: / 25-02-2014 / 21:56:47 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
997 ! |
1014 ! |
998 |
1015 |
999 markSuperFrom:pos1 to:pos2 |
1016 markSuperFrom:pos1 to:pos2 |
|
1017 "in addition to marking, remember the variable reference" |
|
1018 |
1000 | node | |
1019 | node | |
1001 |
1020 |
1002 super markSuperFrom:pos1 to:pos2. |
1021 super markSuperFrom:pos1 to:pos2. |
1003 |
1022 |
1004 node := SuperNode new. |
1023 node := SuperNode new. |
1005 node startPosition: pos1 endPosition: pos2. |
|
1006 node type: #Super. |
1024 node type: #Super. |
1007 self rememberVariableElementFor: node from:pos1 to:pos2 assigned:false |
1025 self rememberVariableElementFor: node from:pos1 to:pos2 assigned:false |
1008 |
1026 |
1009 "Created: / 25-02-2014 / 21:57:16 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
1027 "Created: / 25-02-2014 / 21:57:16 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
1010 ! |
1028 ! |
1027 "Modified: / 21-08-2011 / 09:26:30 / cg" |
1045 "Modified: / 21-08-2011 / 09:26:30 / cg" |
1028 "Modified: / 25-02-2014 / 14:07:39 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
1046 "Modified: / 25-02-2014 / 14:07:39 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
1029 ! |
1047 ! |
1030 |
1048 |
1031 rememberVariableElementFor:node from:pos1 to:pos2 assigned:assigned |
1049 rememberVariableElementFor:node from:pos1 to:pos2 assigned:assigned |
1032 |name typeSymbol element prev| |
1050 |name typeSymbol key element prev| |
|
1051 |
|
1052 node startPosition: pos1 endPosition: pos2. |
1033 |
1053 |
1034 name := node name. |
1054 name := node name. |
1035 typeSymbol := node type. |
1055 typeSymbol := key := node type. |
1036 prev := (lastVariableElements at:typeSymbol ifAbsentPut:[Dictionary new]) at:name ifAbsent:[nil]. |
1056 (typeSymbol == #BlockArg or:[typeSymbol == #BlockVariable]) ifTrue:[ |
|
1057 key := (typeSymbol -> node block) |
|
1058 ]. |
|
1059 |
|
1060 prev := (lastVariableElements at:key ifAbsentPut:[Dictionary new]) at:name ifAbsent:[nil]. |
1037 (prev notNil and:[prev start == pos1]) ifTrue:[ |
1061 (prev notNil and:[prev start == pos1]) ifTrue:[ |
1038 "/ prev assigned:assigned. |
1062 "/ prev assigned:assigned. |
1039 ^ self |
1063 ^ self |
1040 ]. |
1064 ]. |
1041 |
1065 |
1042 element := elements newElementFor: node. |
1066 element := elements newElementFor: node. |
1043 |
1067 |
1044 prev notNil ifTrue:[prev next:element]. |
1068 prev notNil ifTrue:[prev nextElement:element]. |
1045 (lastVariableElements at:typeSymbol) at:name put:element. |
1069 (lastVariableElements at:key) at:name put:element. |
1046 |
1070 |
1047 elements add: element. |
1071 elements add: element. |
1048 |
1072 |
1049 "Created: / 25-02-2014 / 12:13:30 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
1073 "Created: / 25-02-2014 / 12:13:30 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
1050 ! ! |
1074 ! ! |
1051 |
1075 |
1052 !SyntaxHighlighter2 class methodsFor:'documentation'! |
1076 !SyntaxHighlighter2 class methodsFor:'documentation'! |
1053 |
1077 |
1054 version |
1078 version |
1055 ^ '$Header: /cvs/stx/stx/libtool/SyntaxHighlighter2.st,v 1.24 2015-02-27 13:22:39 cg Exp $' |
1079 ^ '$Header: /cvs/stx/stx/libtool/SyntaxHighlighter2.st,v 1.25 2015-02-27 20:20:50 cg Exp $' |
1056 ! |
1080 ! |
1057 |
1081 |
1058 version_CVS |
1082 version_CVS |
1059 ^ '$Header: /cvs/stx/stx/libtool/SyntaxHighlighter2.st,v 1.24 2015-02-27 13:22:39 cg Exp $' |
1083 ^ '$Header: /cvs/stx/stx/libtool/SyntaxHighlighter2.st,v 1.25 2015-02-27 20:20:50 cg Exp $' |
1060 ! |
1084 ! |
1061 |
1085 |
1062 version_SVN |
1086 version_SVN |
1063 ^ '$Id: SyntaxHighlighter2.st,v 1.24 2015-02-27 13:22:39 cg Exp $' |
1087 ^ '$Id: SyntaxHighlighter2.st,v 1.25 2015-02-27 20:20:50 cg Exp $' |
1064 ! ! |
1088 ! ! |
1065 |
1089 |