redcar-javamateview 0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (77) hide show
  1. data/LICENSE +34 -0
  2. data/README +58 -0
  3. data/Rakefile +94 -0
  4. data/lib/javamateview.rb +41 -0
  5. data/lib/javamateview/example.rb +334 -0
  6. data/lib/javamateview/jar/java-mateview.jar +0 -0
  7. data/lib/javamateview/jcodings.jar +0 -0
  8. data/lib/javamateview/jdom.jar +0 -0
  9. data/lib/javamateview/joni.jar +0 -0
  10. data/spec/onig/match_spec.rb +50 -0
  11. data/spec/parsing/dynamic_parsing_spec.rb +172 -0
  12. data/spec/parsing/static_parsing_spec.rb +476 -0
  13. data/spec/spec_helper.rb +33 -0
  14. data/src/com/redcareditor/mate/Bundle.java +81 -0
  15. data/src/com/redcareditor/mate/DoublePattern.java +89 -0
  16. data/src/com/redcareditor/mate/Grammar.java +129 -0
  17. data/src/com/redcareditor/mate/IAnnotationAreaListener.java +7 -0
  18. data/src/com/redcareditor/mate/IGrammarListener.java +5 -0
  19. data/src/com/redcareditor/mate/IncludePattern.java +10 -0
  20. data/src/com/redcareditor/mate/LineNumberRulerColumn.java +922 -0
  21. data/src/com/redcareditor/mate/Marker.java +22 -0
  22. data/src/com/redcareditor/mate/MateText.java +697 -0
  23. data/src/com/redcareditor/mate/ParseThunk.java +71 -0
  24. data/src/com/redcareditor/mate/Parser.java +627 -0
  25. data/src/com/redcareditor/mate/ParserScheduler.java +237 -0
  26. data/src/com/redcareditor/mate/Pattern.java +152 -0
  27. data/src/com/redcareditor/mate/RangeSet.java +91 -0
  28. data/src/com/redcareditor/mate/Scanner.java +178 -0
  29. data/src/com/redcareditor/mate/Scope.java +534 -0
  30. data/src/com/redcareditor/mate/ScopeMatcher.java +162 -0
  31. data/src/com/redcareditor/mate/SharedTextColors.java +110 -0
  32. data/src/com/redcareditor/mate/SinglePattern.java +20 -0
  33. data/src/com/redcareditor/mate/WhitespaceCharacterPainter.java +395 -0
  34. data/src/com/redcareditor/mate/colouring/Colourer.java +16 -0
  35. data/src/com/redcareditor/mate/colouring/swt/MarginPaintListener.java +62 -0
  36. data/src/com/redcareditor/mate/colouring/swt/SwtColourer.java +501 -0
  37. data/src/com/redcareditor/mate/document/MateDocument.java +15 -0
  38. data/src/com/redcareditor/mate/document/MateTextFactory.java +9 -0
  39. data/src/com/redcareditor/mate/document/MateTextLocation.java +8 -0
  40. data/src/com/redcareditor/mate/document/MateTextLocationComparator.java +17 -0
  41. data/src/com/redcareditor/mate/document/MateTextRange.java +18 -0
  42. data/src/com/redcareditor/mate/document/swt/SwtMateDocument.java +143 -0
  43. data/src/com/redcareditor/mate/document/swt/SwtMateTextLocation.java +88 -0
  44. data/src/com/redcareditor/mate/document/swt/SwtMateTextRange.java +92 -0
  45. data/src/com/redcareditor/mate/document/swt/SwtScopePositionUpdater.java +90 -0
  46. data/src/com/redcareditor/mate/undo/MateTextUndoManager.java +11 -0
  47. data/src/com/redcareditor/mate/undo/swt/SwtMateTextUndoManager.java +166 -0
  48. data/src/com/redcareditor/onig/Match.java +212 -0
  49. data/src/com/redcareditor/onig/NullMatch.java +57 -0
  50. data/src/com/redcareditor/onig/NullRx.java +29 -0
  51. data/src/com/redcareditor/onig/Range.java +45 -0
  52. data/src/com/redcareditor/onig/Rx.java +167 -0
  53. data/src/com/redcareditor/plist/Dict.java +119 -0
  54. data/src/com/redcareditor/plist/PlistNode.java +52 -0
  55. data/src/com/redcareditor/plist/PlistPropertyLoader.java +44 -0
  56. data/src/com/redcareditor/theme/ScopeSelector.java +39 -0
  57. data/src/com/redcareditor/theme/Theme.java +122 -0
  58. data/src/com/redcareditor/theme/ThemeManager.java +41 -0
  59. data/src/com/redcareditor/theme/ThemeSetting.java +78 -0
  60. data/src/com/redcareditor/util/FileUtility.java +64 -0
  61. data/src/com/redcareditor/util/SingleLineFormatter.java +11 -0
  62. data/src/com/redcareditor/util/swt/ColourUtil.java +56 -0
  63. data/src/ruby/java-mateview.rb +68 -0
  64. data/test/com/redcareditor/mate/BundleTest.java +33 -0
  65. data/test/com/redcareditor/mate/EmptyRangeSetTest.java +27 -0
  66. data/test/com/redcareditor/mate/FilledRangeSetTest.java +82 -0
  67. data/test/com/redcareditor/mate/GrammarTest.java +158 -0
  68. data/test/com/redcareditor/mate/MateTextTest.java +35 -0
  69. data/test/com/redcareditor/mate/ScopeMatcherMatchingTest.java +55 -0
  70. data/test/com/redcareditor/mate/ScopeMatcherRankingTest.java +40 -0
  71. data/test/com/redcareditor/onig/RxTest.java +54 -0
  72. data/test/com/redcareditor/plist/DictTest.java +33 -0
  73. data/test/com/redcareditor/theme/RailsCastThemeTest.java +37 -0
  74. data/test/com/redcareditor/theme/ScopeSelectorTest.java +38 -0
  75. data/test/com/redcareditor/theme/ThemeManagerTest.java +29 -0
  76. data/test/com/redcareditor/util/swt/ColourUtilTest.java +17 -0
  77. metadata +134 -0
@@ -0,0 +1,33 @@
1
+ package com.redcareditor.mate;
2
+
3
+ import static org.junit.Assert.*;
4
+
5
+ import org.junit.Before;
6
+ import org.junit.Test;
7
+
8
+ public class BundleTest {
9
+
10
+ @Before
11
+ public void setUp() {
12
+ Bundle.loadBundles("input/");
13
+ }
14
+
15
+ @Test
16
+ public void shouldHaveCreatedCorrectBundles() {
17
+ String[] bundleNames = new String[] { "Apache", "Ruby", "HTML", "CSS", "JavaScript", "Perl" };
18
+ for (String bundleName : bundleNames) {
19
+ containsBundleNamed(bundleName);
20
+ }
21
+ assertEquals(11, Bundle.getBundles().size());
22
+ }
23
+
24
+ private void containsBundleNamed(String bundleName) {
25
+ assertNotNull(Bundle.getBundleByName(bundleName));
26
+ }
27
+
28
+ @Test
29
+ public void shouldHaveCreatedCorrectGrammars() {
30
+ assertEquals(1, Bundle.getBundleByName("Apache").getGrammars().size());
31
+ assertEquals(1, Bundle.getBundleByName("Ruby").getGrammars().size());
32
+ }
33
+ }
@@ -0,0 +1,27 @@
1
+ package com.redcareditor.mate;
2
+
3
+ import static org.junit.Assert.*;
4
+
5
+ import org.junit.*;
6
+
7
+ public class EmptyRangeSetTest {
8
+ private RangeSet rs;
9
+
10
+ @Before
11
+ public void setUp() throws Exception {
12
+ rs = new RangeSet();
13
+ }
14
+
15
+ @Test
16
+ public void testShouldReportEmpty() {
17
+ assertTrue(rs.isEmpty());
18
+ }
19
+
20
+ @Test
21
+ public void testShouldAddARange() {
22
+ rs.add(1, 3);
23
+ assertEquals(1, rs.length());
24
+ assertEquals(3, rs.rangeSize());
25
+ }
26
+ }
27
+
@@ -0,0 +1,82 @@
1
+ package com.redcareditor.mate;
2
+
3
+ import static org.junit.Assert.*;
4
+
5
+ import org.junit.Before;
6
+ import org.junit.Test;
7
+
8
+ import com.redcareditor.onig.Range;
9
+
10
+
11
+ public class FilledRangeSetTest {
12
+ private RangeSet rs;
13
+
14
+ @Before
15
+ public void setUp() throws Exception {
16
+ rs = new RangeSet();
17
+ rs.add(1, 3);
18
+ rs.add(5, 5);
19
+ rs.add(10, 15);
20
+ }
21
+
22
+ @Test
23
+ public void testShouldReportLength() {
24
+ assertEquals(3, rs.length());
25
+ }
26
+
27
+ @Test
28
+ public void testShouldReportSize() {
29
+ assertEquals(10, rs.rangeSize());
30
+ }
31
+
32
+ @Test
33
+ public void testShouldMergeRanges() {
34
+ rs.add(14, 16);
35
+ assertEquals(rs.length(), 3);
36
+ assertEquals(rs.get(0), new Range(1,3));
37
+ assertEquals(rs.get(1), new Range(5,5));
38
+ assertEquals(rs.get(2), new Range(10,16));
39
+ }
40
+
41
+ @Test
42
+ public void testShouldMergeRanges2() {
43
+ rs.add(7, 11);
44
+ assertEquals(rs.length(), 3);
45
+ assertEquals(rs.get(0), new Range(1,3));
46
+ assertEquals(rs.get(1), new Range(5,5));
47
+ assertEquals(rs.get(2), new Range(7,15));
48
+ }
49
+
50
+ @Test
51
+ public void testShouldMergeTwoRanges() {
52
+ rs.add(4, 11);
53
+ assertEquals(rs.length(), 1);
54
+ assertEquals(rs.get(0), new Range(1,15));
55
+ }
56
+
57
+ @Test
58
+ public void testShouldMergeAllRanges() {
59
+ rs.add(1, 20);
60
+ assertEquals(rs.length(), 1);
61
+ assertEquals(rs.get(0), new Range(1,20));
62
+ }
63
+
64
+ @Test
65
+ public void testShouldMergeAdjacentRanges() {
66
+ rs.add(16, 18);
67
+ assertEquals(rs.length(), 3);
68
+ assertEquals(rs.get(0), new Range(1,3));
69
+ assertEquals(rs.get(1), new Range(5,5));
70
+ assertEquals(rs.get(2), new Range(10,18));
71
+ }
72
+
73
+ @Test
74
+ public void testShouldMergeTwoAdjacentRanges() {
75
+ rs.add(4, 4);
76
+ assertEquals(rs.length(), 2);
77
+ assertEquals(rs.get(0), new Range(1,5));
78
+ assertEquals(rs.get(1), new Range(10,15));
79
+ }
80
+ }
81
+
82
+
@@ -0,0 +1,158 @@
1
+ package com.redcareditor.mate;
2
+
3
+ import static org.junit.Assert.*;
4
+
5
+ import java.util.ArrayList;
6
+ import java.util.List;
7
+
8
+ import org.junit.Before;
9
+ import org.junit.Test;
10
+
11
+ public class GrammarTest {
12
+ private Grammar g;
13
+
14
+ @Before
15
+ public void setUp() {
16
+ g = new Grammar("input/Bundles/Apache.tmbundle/Syntaxes/Apache.plist");
17
+ g.initForUse();
18
+ }
19
+
20
+ @Test
21
+ public void shouldLoadGrammarInformation() {
22
+ assertEquals("Apache", g.name);
23
+ assertEquals("source.apache-config", g.scopeName);
24
+ }
25
+
26
+ @Test
27
+ public void shouldLoadJavaScriptInformation() {
28
+ Grammar jg = new Grammar("input/Bundles/JavaScript.tmbundle/Syntaxes/JavaScript.plist");
29
+ jg.initForUse();
30
+ assertEquals("JavaScript", jg.name);
31
+ // assertEquals("source.apache-config", g.scopeName);
32
+ }
33
+
34
+ @Test
35
+ public void shouldLoadPatternsIntoMemory() {
36
+ assertTrue("allPatterns is not empty", g.allPatterns.size() > 0);
37
+ List<String> patternNames = patternNames(g.allPatterns);
38
+ assertTrue(patternNames.contains("comment.line.number-sign.apache-config"));
39
+ assertTrue(patternNames.contains("source.include.apache-config"));
40
+ assertTrue(patternNames.contains("support.constant.apache-config"));
41
+ }
42
+
43
+ @Test
44
+ public void shouldLoadPatternsWithoutNames() {
45
+ Pattern foundPattern = find(g.allPatterns, new Predicate() {
46
+ public boolean match(Pattern p) {
47
+ return (p instanceof DoublePattern) &&
48
+ ((DoublePattern)p).bothCaptures != null &&
49
+ ((DoublePattern)p).bothCaptures.values().contains("support.constant.rewritecond.apache-config");
50
+ }
51
+ });
52
+ assertNotNull("Unable to find unnamed rewrite pattern", foundPattern);
53
+ }
54
+
55
+ public void assertNotIncludePattern(Pattern p) {
56
+ assertFalse(p instanceof IncludePattern);
57
+ }
58
+
59
+ @Test
60
+ public void shouldReplaceAllIncludePatterns() {
61
+ for (Pattern p : g.allPatterns) {
62
+ assertNotIncludePattern(p);
63
+ if (p instanceof DoublePattern) {
64
+ for (Pattern p1 : ((DoublePattern)p).patterns) {
65
+ assertNotIncludePattern(p1);
66
+ if (p1 instanceof DoublePattern) {
67
+ for (Pattern p2 : ((DoublePattern)p1).patterns)
68
+ assertNotIncludePattern(p2);
69
+ }
70
+ }
71
+ }
72
+ }
73
+ }
74
+
75
+ @Test
76
+ public void shouldReplacePatternBaseProperly() {
77
+ Pattern p = find(g.allPatterns, new Predicate() {
78
+ public boolean match(Pattern p) {
79
+ return "meta.vhost.apache-config".equals(p.name);
80
+ }
81
+ });
82
+ if (p instanceof DoublePattern) {
83
+ List<String> patternNames = patternNames(((DoublePattern)p).patterns);
84
+ assertTrue(patternNames.contains("meta.vhost.apache-config"));
85
+ } else {
86
+ fail("Expected \"meta.vhost.apache-config\" to parse as a DoublePattern.");
87
+ }
88
+ }
89
+
90
+ @Test
91
+ public void shouldReplaceVarsProperly() {
92
+ Pattern pt = find(g.allPatterns, new Predicate() {
93
+ public boolean match(Pattern p) {
94
+ return (p instanceof DoublePattern) &&
95
+ ((DoublePattern)p).bothCaptures != null &&
96
+ ((DoublePattern)p).bothCaptures.values().contains("support.constant.rewritecond.apache-config");
97
+ }
98
+ });
99
+ List<String> names = patternNames(((DoublePattern)((DoublePattern)pt).patterns.get(0)).patterns);
100
+ assertTrue(names.contains("support.variable.apache-config"));
101
+ assertTrue(names.contains("invalid.illegal.bad-var.apache-config"));
102
+ }
103
+
104
+ @Test
105
+ public void shouldLoadCaptures() {
106
+ for (Pattern p : g.allPatterns) {
107
+ if ("comment.line.number-sign.apache-config".equals(p.name)) {
108
+ assertEquals("punctuation.definition.comment.apache-config", ((SinglePattern) p).captures.get(1));
109
+ }
110
+ }
111
+ }
112
+
113
+ @Test
114
+ public void shouldMarkDisabledPatternsAsDisabled() {
115
+ Bundle.loadBundles("input/");
116
+ Bundle htmlBundle = Bundle.getBundleByName("HTML");
117
+
118
+ Grammar html = null;
119
+ for (Grammar g : htmlBundle.getGrammars()) {
120
+ if ("HTML".equals(g.name)) {
121
+ html = g; break;
122
+ }
123
+ }
124
+
125
+ if (html != null) {
126
+ html.initForUse();
127
+ Pattern smarty = find(html.allPatterns, new Predicate() {
128
+ public boolean match(Pattern p) {
129
+ return "source.smarty.embedded.html".equals(p.name);
130
+ }
131
+ });
132
+ assertTrue(smarty.disabled);
133
+ } else {
134
+ fail("Unable to find HTML grammar in HTML bundle.");
135
+ }
136
+ }
137
+
138
+ public ArrayList<String> patternNames(List<Pattern> patterns) {
139
+ ArrayList<String> result = new ArrayList<String>();
140
+ for (Pattern p : patterns) {
141
+ result.add(p.name);
142
+ }
143
+ return result;
144
+ }
145
+
146
+ public Pattern find(List<Pattern> patterns, Predicate pred) {
147
+ for (Pattern p : patterns) {
148
+ if (pred.match(p)) {
149
+ return p;
150
+ }
151
+ }
152
+ return null;
153
+ }
154
+
155
+ interface Predicate {
156
+ public boolean match(Pattern p);
157
+ }
158
+ }
@@ -0,0 +1,35 @@
1
+ package com.redcareditor.mate;
2
+
3
+ import org.eclipse.swt.widgets.Shell;
4
+ import org.junit.Before;
5
+ import org.junit.Test;
6
+ import static org.junit.Assert.*;
7
+
8
+ public class MateTextTest {
9
+ private MateText mt;
10
+
11
+ @Before
12
+ public void setUp() {
13
+ Bundle.loadBundles("input/");
14
+ Shell shell = new Shell();
15
+ mt = new MateText(shell);
16
+ }
17
+
18
+ @Test
19
+ public void shouldSetTheGrammarByName() {
20
+ assertTrue(mt.setGrammarByName("Ruby"));
21
+ assertEquals("Ruby", mt.parser.grammar.name);
22
+ }
23
+
24
+ @Test
25
+ public void shouldSetTheGrammarByFilename() {
26
+ assertEquals("Ruby", mt.setGrammarByFilename("foo.rb"));
27
+ assertEquals("Apache", mt.setGrammarByFilename(".htaccess"));
28
+ assertEquals("Ruby", mt.setGrammarByFilename("Rakefile"));
29
+ }
30
+
31
+ @Test
32
+ public void shouldSetTheGrammarByFirstLine() {
33
+ assertEquals("Ruby", mt.setGrammarByFirstLine("#!/usr/bin/ruby\n"));
34
+ }
35
+ }
@@ -0,0 +1,55 @@
1
+
2
+ package com.redcareditor.mate;
3
+
4
+ import static org.junit.Assert.*;
5
+ import org.junit.Test;
6
+
7
+ public class ScopeMatcherMatchingTest {
8
+ public boolean testMatch(String a, String b) {
9
+ return ScopeMatcher.testMatch(a, b);
10
+ }
11
+
12
+ @Test
13
+ public void shouldMatchSimpleWords() {
14
+ assertTrue(testMatch("comment", "ruby.comment"));
15
+ assertFalse(testMatch("string", "ruby.comment"));
16
+ assertTrue(testMatch("source.ruby", "source.ruby comment"));
17
+ }
18
+
19
+ @Test
20
+ public void shouldNotMatchSubstrings() {
21
+ assertFalse(testMatch("source.c", "source.coffee"));
22
+ }
23
+
24
+ @Test
25
+ public void shouldTransformDots() {
26
+ assertFalse(testMatch("source.ruby", "sourcearuby comment"));
27
+ assertTrue(testMatch("source.ruby", "source.ruby comment"));
28
+ }
29
+
30
+ @Test
31
+ public void shouldMatchAtSeparateLocationsInTheString() {
32
+ assertTrue(testMatch("ruby string", "ruby interpolated string.quoted"));
33
+ }
34
+
35
+ @Test
36
+ public void shouldMatchWithSelectorOrs() {
37
+ assertTrue(testMatch("string, comment", "ruby.string"));
38
+ assertTrue(testMatch("string, comment", "ruby.comment"));
39
+ }
40
+
41
+ @Test
42
+ public void shouldDealWithNegativeMatches() {
43
+ assertTrue(testMatch("string - string.double", "ruby.string"));
44
+ assertFalse(testMatch("string - string.double", "ruby.string.double"));
45
+ }
46
+
47
+ @Test
48
+ public void shouldDealWithMultipleNegativeMatches() {
49
+ assertFalse(testMatch("string - string.double - comment", "ruby.string.double"));
50
+ assertFalse(testMatch("string - string.double - comment", "ruby.string.comment"));
51
+ }
52
+ }
53
+
54
+
55
+
@@ -0,0 +1,40 @@
1
+
2
+ package com.redcareditor.mate;
3
+
4
+ import static org.junit.Assert.*;
5
+
6
+ import org.junit.Test;
7
+
8
+ public class ScopeMatcherRankingTest {
9
+ public String testRank(String a, String b, String scope) {
10
+ return ScopeMatcher.testRank(a, b, scope);
11
+ }
12
+
13
+ @Test
14
+ public void shouldRankTwoMatchesByTheirElementDepth() {
15
+ assertEquals("string", testRank("string", "ruby", "ruby string"));
16
+ }
17
+
18
+ @Test
19
+ public void shouldRankTwoMatchesByElementDepthNotStringDepth() {
20
+ assertEquals("string == quoted", testRank("string", "quoted", "string.quoted"));
21
+ }
22
+
23
+ @Test
24
+ public void shouldRankTwoMatchesByTheLengthOfTheMatch() {
25
+ assertEquals("string.quoted", testRank("string.quoted", "string", "string.quoted"));
26
+ }
27
+
28
+ @Test
29
+ public void shouldMoveUpTheElementMatchesInCaseOfATieAndCheckElementDepth() {
30
+ assertEquals("ruby string", testRank("ruby string", "source string", "source ruby string"));
31
+ assertEquals("ruby string", testRank("source string", "ruby string", "source ruby string"));
32
+ }
33
+
34
+ @Test
35
+ public void shouldMoveUpTheElementMatchesInCaseOfATieAndCheckMatchLength() {
36
+ assertEquals("source.ruby string", testRank("ruby string", "source.ruby string", "source.ruby string"));
37
+ }
38
+
39
+
40
+ }
@@ -0,0 +1,54 @@
1
+ package com.redcareditor.onig;
2
+
3
+ import java.io.BufferedReader;
4
+ import java.io.StringReader;
5
+
6
+ import org.junit.Test;
7
+ import static org.junit.Assert.*;
8
+
9
+ import com.redcareditor.util.FileUtility;
10
+
11
+ public class RxTest {
12
+ @Test
13
+ public void testSingleFoo() {
14
+ String pattern = "^\\s*(class)\\s+(([.a-zA-Z0-9_:]+(\\s*(&lt;)\\s*[.a-zA-Z0-9_:]+)?)|((&lt;&lt;)\\s*[.a-zA-Z0-9_:]+))+";
15
+ String fileContents = "";
16
+ try {
17
+ fileContents = new String(FileUtility.readFully("input/autocompleter.rb"));
18
+
19
+ BufferedReader reader = new BufferedReader(new StringReader(fileContents));
20
+
21
+ Rx regex = Rx.createRx(pattern);
22
+
23
+ String line;
24
+ while ((line = reader.readLine()) != null) {
25
+ Match m = regex.search(line, 0, line.length());
26
+
27
+ if (m != null) {
28
+ System.out.println(line);
29
+ for (Range r : m) {
30
+ System.out.println(r);
31
+ }
32
+ }
33
+ }
34
+ } catch (Exception e) {
35
+ e.printStackTrace();
36
+ }
37
+ }
38
+
39
+ @Test
40
+ public void testNullObject() {
41
+ String pattern = null;
42
+ Rx rx = Rx.createRx(pattern);
43
+ assertTrue(rx instanceof Rx);
44
+ assertTrue(rx instanceof NullRx);
45
+
46
+ Match match = rx.search("baz");
47
+ assertTrue(match instanceof NullMatch);
48
+ // now check that the object behaves in a reasonable way.
49
+
50
+ assertEquals(0, match.numCaptures());
51
+ assertFalse(match.iterator().hasNext());
52
+ assertEquals(0, match.ranges().size());
53
+ }
54
+ }