Skip to content

Commit 9c6cd39

Browse files
committed
slightly better error handling
1 parent 2449a2c commit 9c6cd39

File tree

9 files changed

+74
-43
lines changed

9 files changed

+74
-43
lines changed

drjava/build.xml

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -152,20 +152,24 @@
152152
<property name="version-source" value="${src-working-dir}/Version.orig" />
153153
<property name="version-target" value="${src-working-dir}/Version.java" />
154154

155+
<property name="lib" location="lib"/>
155156

156-
<path id="jarclasspath">
157-
<fileset dir="lib">
157+
158+
<path id="classpath">
159+
<fileset dir="${lib}">
158160
<include name="*.jar"/>
159161
</fileset>
160162
</path>
161163

162164
<!-- === Generate Lexer/Parser === -->
163165
<target name="generate-lexer" description="Generate ANTLR lexer and parser">
164-
<java classname="org.antlr.v4.Tool" fork="true" classpathref="jarclasspath">
166+
<java classname="org.antlr.v4.Tool" fork="true" classpathref="classpath">
165167
<arg value="-package" />
166168
<arg value="edu.rice.cs.drjava.model.compiler.fjpreprocessor.grammar" />
167169
<arg line="-no-listener -no-visitor"/>
168170
<arg value="${src-working-dir}/model/compiler/fjpreprocessor/grammar/JavaLexer.g4"/>
171+
<!-- Optional: JavaParser.g4 -->
172+
<!-- <arg value="${src}/grammar/JavaParser.g4"/> -->
169173
</java>
170174
</target>
171175

@@ -199,7 +203,7 @@
199203

200204

201205
<!-- The following target assumes that javac resolves to a Java 8 compiler -->
202-
<target name="compile" depends="generate-lexer, generate-source, do-compile, copy-resources, unjar-libs
206+
<target name="compile" depends="generate-lexer, generate-source, do-compile, copy-resources, unjar-libs"
203207
description="Compile all source files (after generating the source)">
204208
</target>
205209

@@ -599,13 +603,7 @@
599603
Clean Targets
600604
************* -->
601605

602-
<target name="clean" depends="clean-intermediate, clean-coverage-report, clean-products, clean-lexer" description="Remove all build products; the result should match the intended Subversion contents">
603-
</target>
604-
605-
<target name="clean-lexer" unless="skip-clean">
606-
<delete file="src/edu/rice/cs/drjava/model/compiler/fjpreprocessor/grammar/JavaLexer.interp" />
607-
<delete file="src/edu/rice/cs/drjava/model/compiler/fjpreprocessor/grammar/JavaLexer.tokens" />
608-
<delete file="src/edu/rice/cs/drjava/model/compiler/fjpreprocessor/grammar/JavaLexer.java" />
606+
<target name="clean" depends="clean-intermediate, clean-coverage-report, clean-products" description="Remove all build products; the result should match the intended Subversion contents">
609607
</target>
610608

611609
<target name="clean-intermediate" unless="skip-clean">

drjava/src/edu/rice/cs/drjava/model/compiler/DefaultCompilerModel.java

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -555,12 +555,9 @@ public boolean accept(File dir, String name) {
555555

556556

557557
/* Perform language levels conversion, creating corresponding .java files. */
558-
try {
559-
Preprocessor.preprocessList(files);
560-
}
561-
catch (Throwable t) {
562-
errors.add(new DJError("Language Level Preprocessor failed: " + t.getMessage(), false));
563-
}
558+
559+
LinkedList<DJError> e = Preprocessor.preprocessList(files);
560+
errors.addAll(e);
564561

565562

566563

drjava/src/edu/rice/cs/drjava/model/compiler/fjpreprocessor/Preprocessor.java

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import java.io.Writer;
66
import java.util.ArrayList;
77
import java.util.List;
8+
import java.util.LinkedList;
89

910
import org.antlr.v4.runtime.*;
1011

@@ -17,6 +18,8 @@
1718

1819
import edu.rice.cs.drjava.model.compiler.fjpreprocessor.grammar.JavaLexer;
1920

21+
import edu.rice.cs.drjava.model.DJError;
22+
2023
public class Preprocessor {
2124

2225
/**
@@ -29,24 +32,44 @@ public class Preprocessor {
2932
* @param files
3033
* @throws Exception
3134
*/
32-
public static void preprocessList(List<File> files) throws Exception {
35+
public static LinkedList<DJError> preprocessList(List<File> files) {
36+
LinkedList<DJError> errors = new LinkedList<DJError>();
3337
for (File file : files) {
3438
if (file.getName().endsWith(".fjava")) {
3539
File outputFile = new File(file.getAbsolutePath().replace(".fjava", ".java"));
36-
doPreprocess(file, outputFile);
40+
DJError e = doPreprocess(file, outputFile);
41+
if (e != null) {
42+
errors.add(e);
43+
}
44+
}
45+
if (file.getName().endsWith(".java")) {
46+
// Check if the file is a .java file and not a .fjava file
47+
// If it is a .java file, we can ignore it
48+
continue;
3749
}
50+
51+
errors.add(new DJError(
52+
"File " + file.getAbsolutePath() + " is a languagle level file which is no longer supported.",
53+
false));
3854
}
55+
return errors;
3956
}
4057

41-
static void doPreprocess(File inputFile, File outputFile) throws Exception {
42-
CharStream input = CharStreams.fromPath(inputFile.toPath());
58+
static DJError doPreprocess(File inputFile, File outputFile) {
59+
CharStream input;
60+
try {
61+
input = CharStreams.fromPath(inputFile.toPath());
62+
} catch (Exception e) {
63+
return new DJError("Error reading file: " + inputFile.getAbsolutePath(), false);
64+
}
4365
ASTNode ast = FJPreprocessor.process(input);
44-
String output = new CodeGenVisitor().generate(ast);
66+
String output = CodeGenVisitor.generate(ast);
4567
try (Writer writer = new FileWriter(outputFile)) {
4668
writer.write(output.toString());
4769
} catch (Exception e) {
48-
throw new RuntimeException("Error writing to file: " + outputFile.getAbsolutePath(), e);
70+
return new DJError("Error writing to file: " + outputFile.getAbsolutePath(), false);
4971
}
72+
return null; // No errors
5073
}
5174

5275
}

drjava/src/edu/rice/cs/drjava/model/compiler/fjpreprocessor/node/ASTNode.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,5 @@
33
import edu.rice.cs.drjava.model.compiler.fjpreprocessor.node.visitor.ASTVisitor;
44

55
public interface ASTNode {
6-
<T> void accept(ASTVisitor<T> visitor);
6+
<T> T accept(ASTVisitor<T> visitor);
77
}

drjava/src/edu/rice/cs/drjava/model/compiler/fjpreprocessor/node/DCNode.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ public void addOther(String other) {
4646
public String toString() {
4747
return "data-class " + name + " " + vars.toString();
4848
}
49-
public <T> void accept(ASTVisitor<T> visitor) {
50-
visitor.visit(this);
49+
public <T> T accept(ASTVisitor<T> visitor) {
50+
return visitor.visit(this);
5151
}
5252
}

drjava/src/edu/rice/cs/drjava/model/compiler/fjpreprocessor/node/RawJavaNode.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ public String text() {
1414
public String toString() {
1515
return text;
1616
}
17-
public <T> void accept(ASTVisitor<T> visitor) {
18-
visitor.visit(this);
17+
public <T> T accept(ASTVisitor<T> visitor) {
18+
return visitor.visit(this);
1919
}
2020
}

drjava/src/edu/rice/cs/drjava/model/compiler/fjpreprocessor/node/RootNode.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ public void addChild(ASTNode child) {
1919
}
2020

2121
@Override
22-
public <T> void accept(ASTVisitor<T> visitor) {
23-
visitor.visit(this);
22+
public <T> T accept(ASTVisitor<T> visitor) {
23+
return visitor.visit(this);
2424
}
2525
}

drjava/src/edu/rice/cs/drjava/model/compiler/fjpreprocessor/node/visitor/ASTVisitor.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,6 @@
66

77
public interface ASTVisitor<T> {
88
T visit(RawJavaNode node);
9-
T visit(DCNode node); // Add this line to the interface
10-
T visit(RootNode node); // Add this line to the interface
9+
T visit(DCNode node);
10+
T visit(RootNode node);
1111
}

drjava/src/edu/rice/cs/drjava/model/compiler/fjpreprocessor/node/visitor/CodeGenVisitor.java

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,21 +8,27 @@
88

99
public class CodeGenVisitor implements ASTVisitor<StringBuilder> {
1010

11-
private final StringBuilder output = new StringBuilder();
1211

13-
public String generate(ASTNode node) {
14-
node.accept(this);
15-
return output.toString();
12+
private static final CodeGenVisitor INSTANCE = new CodeGenVisitor();
13+
private CodeGenVisitor() {
14+
// Private constructor to prevent instantiation
15+
}
16+
17+
public static String generate(ASTNode node) {
18+
StringBuilder output = node.accept(INSTANCE);
19+
return output.toString();
1620
}
1721

1822
@Override
1923
public StringBuilder visit(RawJavaNode node) {
24+
StringBuilder output = new StringBuilder();
2025
output.append(node.text());
2126
return output;
2227
}
2328

2429
@Override
2530
public StringBuilder visit(DCNode node) {
31+
StringBuilder output = new StringBuilder();
2632
output.append("class ").append(node.name());
2733

2834
if (!node.typeVars().isEmpty()) {
@@ -76,7 +82,7 @@ public StringBuilder visit(DCNode node) {
7682
output.append(" // PREPROCESSOR NOTE: toString method already defined\n\n");
7783
} else {
7884
output.append(" // PREPROCESSOR NOTE: toString method generated\n");
79-
generateToStringMethod(node);
85+
output.append(generateToStringMethod(node));
8086
}
8187

8288
// HashCode method
@@ -85,7 +91,7 @@ public StringBuilder visit(DCNode node) {
8591
output.append(" // PREPROCESSOR NOTE: hashCode method already defined\n\n");
8692
} else {
8793
output.append(" // PREPROCESSOR NOTE: hashCode method generated\n");
88-
generateHashCodeMethod(node);
94+
output.append(generateHashCodeMethod(node));
8995
}
9096

9197
// Equals method
@@ -94,7 +100,7 @@ public StringBuilder visit(DCNode node) {
94100
output.append(" // PREPROCESSOR NOTE: equals method already defined\n\n");
95101
} else {
96102
output.append(" // PREPROCESSOR NOTE: equals method generated\n");
97-
generateEqualsMethod(node);
103+
output.append(generateEqualsMethod(node));
98104
}
99105

100106
output.append("/****************************************\\\n");
@@ -109,7 +115,8 @@ public StringBuilder visit(DCNode node) {
109115
return output;
110116
}
111117

112-
private void generateHashCodeMethod(DCNode node) {
118+
private StringBuilder generateHashCodeMethod(DCNode node) {
119+
StringBuilder output = new StringBuilder();
113120
output.append(" @Override\n")
114121
.append(" public int hashCode() {\n")
115122
.append(" return java.util.Objects.hash(");
@@ -121,9 +128,11 @@ private void generateHashCodeMethod(DCNode node) {
121128
}
122129
output.append(");\n")
123130
.append(" }\n\n");
131+
return output;
124132
}
125133

126-
private void generateEqualsMethod(DCNode node) {
134+
private StringBuilder generateEqualsMethod(DCNode node) {
135+
StringBuilder output = new StringBuilder();
127136
output.append(" @Override\n")
128137
.append(" public boolean equals(Object obj) {\n")
129138
.append(" if (this == obj) return true;\n")
@@ -139,9 +148,11 @@ private void generateEqualsMethod(DCNode node) {
139148
}
140149

141150
output.append(";\n }\n\n");
151+
return output;
142152
}
143153

144-
private void generateToStringMethod(DCNode node) {
154+
private StringBuilder generateToStringMethod(DCNode node) {
155+
StringBuilder output = new StringBuilder();
145156
output.append(" @Override\n")
146157
.append(" public String toString() {\n")
147158
.append(" return \"").append(node.name()).append("(\" + ");
@@ -153,12 +164,14 @@ private void generateToStringMethod(DCNode node) {
153164
}
154165
output.append(" + \")\";\n")
155166
.append(" }\n\n");
167+
return output;
156168
}
157169

158170
@Override
159171
public StringBuilder visit(RootNode node) {
172+
StringBuilder output = new StringBuilder();
160173
for (ASTNode child : node.children()) {
161-
child.accept(this);
174+
output.append(child.accept(this));
162175
}
163176
return output;
164177
}

0 commit comments

Comments
 (0)