Skip to content

Commit 0b71289

Browse files
committed
0.3.0 - Added basic Java parsing support and some initial tests for parsed Java AST. Refactored many interfaces into JTextParser library and renamed some methods. Refactored interm parsing to be more generic, reused some C# interm parsers for fields, methods, and method parameters for Java interm parsing.
1 parent a33f37a commit 0b71289

File tree

81 files changed

+2242
-1576
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

81 files changed

+2242
-1576
lines changed

.classpath

+1
Original file line numberDiff line numberDiff line change
@@ -23,5 +23,6 @@
2323
<classpathentry kind="con" path="org.eclipse.jdt.USER_LIBRARY/TemplateUtil"/>
2424
<classpathentry kind="lib" path="C:/Users/TeamworkGuy2/Documents/Java/Libraries/jtree-walker/jar/jtree_walker.jar" sourcepath="/JTreeWalker"/>
2525
<classpathentry kind="lib" path="C:/Users/TeamworkGuy2/Documents/Java/Libraries/data-transfer/jar/data_transfer.jar"/>
26+
<classpathentry kind="lib" path="C:/Users/TeamworkGuy2/Documents/Java/Libraries/jparser-data-type-like/jar/jparser_data_type_like.jar" sourcepath="/JParserDataTypeLike"/>
2627
<classpathentry kind="output" path="bin"/>
2728
</classpath>

README.md

+33-30
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
ParserToolsTmp
22
==============
3-
version: 0.2.1
3+
version: 0.3.0
44

55
In progress C#/Java/TypeScript parser tools built atop [JTextParser] (https://github.com/TeamworkGuy2/JTextParser), [Jackson] (https://github.com/FasterXML/jackson-core/) (core, databind, annotations) and half a dozen other utility libraries.
66

@@ -16,71 +16,73 @@ In progress C#/Java/TypeScript parser tools built atop [JTextParser] (https://gi
1616
Example:
1717
--------
1818

19-
Source Code:
20-
19+
Source Code (SimpleCs.cs):
20+
```C#
2121
namespace ParserExamples.Samples {
2222

2323
/// <summary>
2424
/// A simple class to test parsing.
2525
/// </summary>
2626
public class SimpleCs {
2727

28-
/// <value>The names.</value>
29-
public IList<string> Names { get; set; }
28+
/// <value>The names.</value>
29+
public IList<string> Names { get; set; }
3030

31-
/// <value>The number of names.</value>
32-
public int Count { get; set }
31+
/// <value>The number of names.</value>
32+
public int Count { get; set; }
33+
34+
/// <summary>Add name</summary>
35+
/// <param name="name">the name</param>
36+
/// <returns>the names</returns>
37+
[OperationContract]
38+
[WebInvoke(Method = "POST", UriTemplate = "/AddName?name={name}",
39+
ResponseFormat = WebMessageFormat.Json)]
40+
[TransactionFlow(TransactionFlowOption.Allowed)]
41+
Result<IList<String>> AddName(string name) {
42+
content of block;
43+
}
3344

34-
/// <summary>
35-
/// Add name
36-
/// </summary>
37-
/// <param name="name">the name</param>
38-
/// <returns>the names</returns>
39-
[OperationContract]
40-
[WebInvoke(Method = "POST", UriTemplate = "/AddName?name={name}",
41-
ResponseFormat = WebMessageFormat.Json)]
42-
[TransactionFlow(TransactionFlowOption.Allowed)]
43-
Result<IList<String>> AddName(string name) {
44-
content of block;
4545
}
4646

4747
}
48+
```
4849

4950

50-
Parser Code:
51-
52-
CodeFileSrc<CodeLanguage> simpleCsAst = ParseCodeFile.parseCode(simpleCsName, CodeLanguageOptions.C_SHARP, simpleCsCode);
51+
Java code to parser SimpleCs.cs (simple_cs_source_string is a string containing the contents of SimpleCs.cs):
52+
```Java
53+
CodeFileSrc<CodeLanguage> simpleCsAst = ParseCodeFile.parseCode("SimpleCs.cs", CodeLanguageOptions.C_SHARP, simple_cs_source_string);
5354
WriteSettings ws = new WriteSettings(true, true, true);
5455

55-
for(val block : CodeLanguageOptions.C_SHARP.getExtractor().extractClassFieldsAndMethodSignatures(simpleCsAst.getDoc())) {
56-
CodeFileParsed.Simple<String, CsBlock> fileParsed = new CodeFileParsed.Simple<>(simpleCsName, block.getValue(), block.getKey());
56+
for(Map.Entry<SimpleTree<DocumentFragmentText<CodeFragmentType>>, IntermClass.SimpleImpl<CsBlock>> block : CodeLanguageOptions.C_SHARP.getExtractor().extractClassFieldsAndMethodSignatures(simpleCsAst.getDoc())) {
57+
CodeFileParsed.Simple<String, CsBlock> fileParsed = new CodeFileParsed.Simple<>("SimpleCs.cs", block.getValue(), block.getKey());
5758

5859
StringBuilder sb = new StringBuilder();
5960
fileParsed.getParsedClass().toJson(sb, ws);
60-
System.out.println(sb.toString());
61+
System.out.println(sb.toString()); // Print the parsed AST to System.out
6162
}
63+
```
6264

6365

64-
JSON Result:
65-
66+
JSON Result (printed to System.out):
67+
```JSON
6668
{
6769
"classSignature" : {
6870
"access" : "PUBLIC",
69-
"name" : "SimpleCs",
71+
"name" : "ParserExamples.Samples.SimpleCs",
7072
"declarationType" : "class"
7173
},
7274
"blockType" : "CLASS",
7375
"using" : [],
7476
"fields" : [{
75-
"name" : "SimpleCs.Names",
77+
"name" : "ParserExamples.Samples.SimpleCs.Names",
7678
"type" : "IList[string]"
7779
}, {
78-
"name" : "SimpleCs.Count",
80+
"name" : "ParserExamples.Samples.SimpleCs.Count",
7981
"type" : "int"
8082
}
8183
],
8284
"methods" : [{
83-
"name" : "SimpleCs.AddName",
85+
"name" : "ParserExamples.Samples.SimpleCs.AddName",
8486
"parameters" : [{
8587
"type" : "string",
8688
"name" : "name"
@@ -118,3 +120,4 @@ JSON Result:
118120
}
119121
]
120122
}
123+
```

src/twg2/parser/baseAst/AstTypeChecker.java

-8
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,4 @@ public interface AstTypeChecker<T_KEYWORD> {
1515

1616
public boolean isKeyword(DocumentFragmentText<CodeFragmentType> node, T_KEYWORD keyword1, T_KEYWORD keyword2, T_KEYWORD keyword3);
1717

18-
/** Checks for block identifying keywords (i.e. 'namespace', 'module', 'class', 'interface')
19-
*/
20-
public boolean isBlockKeyword(DocumentFragmentText<CodeFragmentType> node);
21-
22-
/** Checks for class/interface block modifier keywords (i.e. 'abstract', 'static', 'final', 'sealed')
23-
*/
24-
public boolean isClassModifierKeyword(DocumentFragmentText<CodeFragmentType> node);
25-
2618
}

src/twg2/parser/baseAst/AstUtil.java

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package twg2.parser.baseAst;
2+
3+
4+
/**
5+
* @author TeamworkGuy2
6+
* @since 2015-12-6
7+
*/
8+
public interface AstUtil<T_BLOCK extends CompoundBlock, T_KEYWORD> {
9+
10+
public AccessModifierParser<AccessModifierEnum, T_BLOCK> getAccessModifierParser();
11+
12+
public AstTypeChecker<T_KEYWORD> getChecker();
13+
}

src/twg2/parser/baseAst/LanguageAstUtil.java

-12
This file was deleted.

src/twg2/parser/baseAst/csharp/CsAstUtil.java

+2-18
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import twg2.parser.baseAst.AccessModifierEnum;
44
import twg2.parser.baseAst.AccessModifierParser;
55
import twg2.parser.baseAst.AstTypeChecker;
6-
import twg2.parser.baseAst.LanguageAstUtil;
6+
import twg2.parser.baseAst.AstUtil;
77
import twg2.parser.codeParser.CodeFragmentType;
88
import twg2.parser.codeParser.CodeLanguage;
99
import twg2.parser.codeParser.CodeLanguageOptions;
@@ -16,7 +16,7 @@
1616
* @author TeamworkGuy2
1717
* @since 2015-12-6
1818
*/
19-
public class CsAstUtil implements AccessModifierParser<AccessModifierEnum, CsBlock>, AstTypeChecker<CsKeyword>, LanguageAstUtil {
19+
public class CsAstUtil implements AccessModifierParser<AccessModifierEnum, CsBlock>, AstTypeChecker<CsKeyword>, AstUtil<CsBlock, CsKeyword> {
2020

2121
@Override
2222
public CodeLanguage getLanguage() {
@@ -122,20 +122,4 @@ public boolean isKeyword(DocumentFragmentText<CodeFragmentType> node, CsKeyword
122122
return node != null && (node.getFragmentType() == CodeFragmentType.KEYWORD && (keyword1.getSrcName().equals(node.getText()) || keyword2.getSrcName().equals(node.getText()) || keyword3.getSrcName().equals(node.getText())));
123123
}
124124

125-
126-
@Override
127-
public boolean isBlockKeyword(DocumentFragmentText<CodeFragmentType> node) {
128-
return node != null && (node.getFragmentType() == CodeFragmentType.KEYWORD &&
129-
(CsKeyword.CLASS.getSrcName().equals(node.getText()) || CsKeyword.INTERFACE.getSrcName().equals(node.getText()) || CsKeyword.NAMESPACE.getSrcName().equals(node.getText())));
130-
}
131-
132-
133-
@Override
134-
public boolean isClassModifierKeyword(DocumentFragmentText<CodeFragmentType> node) {
135-
String text = null;
136-
return node != null && (node.getFragmentType() == CodeFragmentType.KEYWORD &&
137-
(CsKeyword.PUBLIC.getSrcName().equals((text = node.getText())) || CsKeyword.PROTECTED.getSrcName().equals(text) || CsKeyword.INTERNAL.getSrcName().equals(text) || CsKeyword.PRIVATE.getSrcName().equals(text) ||
138-
CsKeyword.ABSTRACT.getSrcName().equals(text) || CsKeyword.SEALED.getSrcName().equals(text) || CsKeyword.STATIC.getSrcName().equals(text)));
139-
}
140-
141125
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
package twg2.parser.baseAst.java;
2+
3+
import twg2.parser.baseAst.AccessModifierEnum;
4+
import twg2.parser.baseAst.AccessModifierParser;
5+
import twg2.parser.baseAst.AstTypeChecker;
6+
import twg2.parser.baseAst.AstUtil;
7+
import twg2.parser.codeParser.CodeFragmentType;
8+
import twg2.parser.codeParser.CodeLanguage;
9+
import twg2.parser.codeParser.CodeLanguageOptions;
10+
import twg2.parser.codeParser.java.JavaBlock;
11+
import twg2.parser.codeParser.java.JavaKeyword;
12+
import twg2.parser.documentParser.DocumentFragmentText;
13+
import dataUtils.EnumUtil;
14+
15+
/**
16+
* @author TeamworkGuy2
17+
* @since 2016-1-14
18+
*/
19+
public class JavaAstUtil implements AccessModifierParser<AccessModifierEnum, JavaBlock>, AstTypeChecker<JavaKeyword>, AstUtil<JavaBlock, JavaKeyword> {
20+
21+
@Override
22+
public CodeLanguage getLanguage() {
23+
return CodeLanguageOptions.JAVA;
24+
}
25+
26+
27+
@Override
28+
public JavaAstUtil getAccessModifierParser() {
29+
return this;
30+
}
31+
32+
33+
@Override
34+
public AstTypeChecker<JavaKeyword> getChecker() {
35+
return this;
36+
}
37+
38+
39+
@Override
40+
public AccessModifierEnum defaultAccessModifier(String src, JavaBlock currentBlock, JavaBlock parentBlock) {
41+
AccessModifierEnum access = tryFromLanguageSrc(src);
42+
return defaultAccessModifier(access, currentBlock, parentBlock);
43+
}
44+
45+
46+
@Override
47+
public final AccessModifierEnum defaultAccessModifier(AccessModifierEnum access, JavaBlock currentBlock, JavaBlock parentBlock) {
48+
if(access != null) {
49+
return access;
50+
}
51+
52+
if(parentBlock == null) {
53+
return AccessModifierEnum.NAMESPACE_LOCAL;
54+
}
55+
56+
switch(currentBlock) {
57+
case CLASS:
58+
switch(parentBlock) {
59+
case CLASS: // class { class }
60+
case ENUM: // enum { class }
61+
return AccessModifierEnum.NAMESPACE_LOCAL;
62+
case INTERFACE: // interface { class }
63+
return AccessModifierEnum.PUBLIC;
64+
default:
65+
throw EnumUtil.unknownValue(parentBlock, JavaBlock.class);
66+
}
67+
case INTERFACE:
68+
switch(parentBlock) {
69+
case CLASS: // class { interface }
70+
case ENUM: // enum { interface }
71+
return AccessModifierEnum.NAMESPACE_LOCAL;
72+
case INTERFACE: // interface { interface }
73+
return AccessModifierEnum.PUBLIC;
74+
default:
75+
throw EnumUtil.unknownValue(parentBlock, JavaBlock.class);
76+
}
77+
case ENUM:
78+
switch(parentBlock) {
79+
case CLASS: // class { enum }
80+
case ENUM: // enum { enum }
81+
return AccessModifierEnum.NAMESPACE_LOCAL;
82+
case INTERFACE: // interface { enum }
83+
return AccessModifierEnum.PUBLIC;
84+
default:
85+
throw EnumUtil.unknownValue(parentBlock, JavaBlock.class);
86+
}
87+
default:
88+
throw EnumUtil.unknownValue(currentBlock, JavaBlock.class);
89+
}
90+
}
91+
92+
93+
@Override
94+
public final AccessModifierEnum tryFromLanguageSrc(String src) {
95+
if("public".equals(src)) {
96+
return AccessModifierEnum.PUBLIC;
97+
}
98+
if("private".equals(src)) {
99+
return AccessModifierEnum.PRIVATE;
100+
}
101+
if("protected".equals(src)) {
102+
return AccessModifierEnum.NAMESPACE_OR_INHERITANCE_LOCAL;
103+
}
104+
if("".equals(src)) {
105+
return AccessModifierEnum.NAMESPACE_LOCAL;
106+
}
107+
return null;
108+
}
109+
110+
111+
@Override
112+
public boolean isKeyword(DocumentFragmentText<CodeFragmentType> node, JavaKeyword keyword1) {
113+
return node != null && (node.getFragmentType() == CodeFragmentType.KEYWORD && keyword1.getSrcName().equals(node.getText()));
114+
}
115+
116+
117+
@Override
118+
public boolean isKeyword(DocumentFragmentText<CodeFragmentType> node, JavaKeyword keyword1, JavaKeyword keyword2) {
119+
return node != null && (node.getFragmentType() == CodeFragmentType.KEYWORD && (keyword1.getSrcName().equals(node.getText()) || keyword2.getSrcName().equals(node.getText())));
120+
}
121+
122+
123+
@Override
124+
public boolean isKeyword(DocumentFragmentText<CodeFragmentType> node, JavaKeyword keyword1, JavaKeyword keyword2, JavaKeyword keyword3) {
125+
return node != null && (node.getFragmentType() == CodeFragmentType.KEYWORD && (keyword1.getSrcName().equals(node.getText()) || keyword2.getSrcName().equals(node.getText()) || keyword3.getSrcName().equals(node.getText())));
126+
}
127+
128+
}

src/twg2/parser/codeParser/AstExtractor.java

+20
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,14 @@
44
import java.util.Map.Entry;
55

66
import twg2.parser.baseAst.CompoundBlock;
7+
import twg2.parser.condition.AstParser;
78
import twg2.parser.documentParser.DocumentFragmentText;
9+
import twg2.parser.intermAst.annotation.AnnotationSig;
10+
import twg2.parser.intermAst.block.IntermBlock;
811
import twg2.parser.intermAst.classes.IntermClass;
12+
import twg2.parser.intermAst.field.IntermFieldSig;
13+
import twg2.parser.intermAst.method.IntermMethodSig;
14+
import twg2.parser.intermAst.type.TypeSig;
915
import twg2.treeLike.simpleTree.SimpleTree;
1016

1117
/**
@@ -15,6 +21,20 @@
1521
*/
1622
public interface AstExtractor<T_BLOCK extends CompoundBlock> {
1723

24+
public AstParser<List<List<String>>> createImportStatementParser();
25+
26+
public AstParser<TypeSig.Simple> createTypeParser();
27+
28+
public AstParser<List<AnnotationSig>> createAnnotationParser(IntermBlock<T_BLOCK> block);
29+
30+
public AstParser<List<IntermFieldSig>> createFieldParser(IntermBlock<T_BLOCK> block, AstParser<TypeSig.Simple> typeParser, AstParser<List<AnnotationSig>> annotationParser);
31+
32+
public AstParser<List<IntermMethodSig.SimpleImpl>> createMethodParser(IntermBlock<T_BLOCK> block, AstParser<TypeSig.Simple> typeParser, AstParser<List<AnnotationSig>> annotationParser);
33+
34+
35+
public List<IntermBlock<T_BLOCK>> extractBlocks(List<String> nameScope, SimpleTree<DocumentFragmentText<CodeFragmentType>> astTree, IntermBlock<T_BLOCK> parentScope);
36+
37+
1838
public List<Entry<SimpleTree<DocumentFragmentText<CodeFragmentType>>, IntermClass.SimpleImpl<T_BLOCK>>> extractClassFieldsAndMethodSignatures(SimpleTree<DocumentFragmentText<CodeFragmentType>> astTree);
1939

2040
}

0 commit comments

Comments
 (0)