Skip to content

Commit

Permalink
Closes #290: Support detection of mixed modes in preproc.
Browse files Browse the repository at this point in the history
Make a more friendly error message when the user is mixing modes, allowing for localization of error.
  • Loading branch information
sampottinger committed Jan 29, 2022
1 parent efd22f8 commit 0f9b290
Show file tree
Hide file tree
Showing 5 changed files with 35 additions and 4 deletions.
3 changes: 2 additions & 1 deletion build/shared/lib/languages/PDE.properties
Original file line number Diff line number Diff line change
Expand Up @@ -415,6 +415,7 @@ editor.status.bad.generic = Possibly missing type in generic near '%s'?
editor.status.bad.identifier = Bad identifier? Did you forget a variable or start an identifier with digits near '%s'?
editor.status.bad.parameter = Error on parameter or method declaration near '%s'?
editor.status.bad.import = Import not allowed here.
editor.status.bad.mixed_mode = You may be mixing active and static modes which is not allowed.
editor.status.extraneous = Incomplete statement or extra code near '%s'?
editor.status.mismatched = Missing operator, semicolon, or '}' near '%s'?
editor.status.missing.name = Missing name or ; near '%s'?
Expand Down Expand Up @@ -644,4 +645,4 @@ movie_maker.progress.creating_output_file = Creating output file
movie_maker.progress.initializing = Initializing...
movie_maker.progress.processing = Processing %s.

movie_maker.progress.handling_frame = Converting frame %s of %s...
movie_maker.progress.handling_frame = Converting frame %s of %s...
1 change: 1 addition & 0 deletions build/shared/lib/languages/PDE_es.properties
Original file line number Diff line number Diff line change
Expand Up @@ -387,6 +387,7 @@ editor.status.bad.identifier = Error en este identificador? Es posible que tu ol
editor.status.bad.generic = Error en genérico cerca '%s'. Falta un tipo?
editor.status.bad.parameter = Error en un parámetro o una declaración de método cerca '%s'?
editor.status.bad.import = Una declaración de importación no es permitida en una definición de una clasa.
editor.status.bad.mixed_mode = Es possible que estás usando el modo estático y activo.
editor.status.extraneous = Una declaración incompleta o un imprevisto clave cerca '%s'?
editor.status.mismatched = Falta un punto y coma, un operador, o un '}' cerca '%s'?
editor.status.missing.name = Falta ; o nombre cerca '%s'?
Expand Down
19 changes: 18 additions & 1 deletion java/src/processing/mode/java/preproc/PdeParseTreeListener.java
Original file line number Diff line number Diff line change
Expand Up @@ -316,6 +316,23 @@ public void exitProcessingSketch(ProcessingParser.ProcessingSketchContext ctx) {
footerResult = prepareFooter(rewriter, length);
}

@Override
public void enterWarnMixedModes(ProcessingParser.WarnMixedModesContext ctx) {
pdeParseTreeErrorListenerMaybe.ifPresent((listener) -> {
Token token = ctx.getStart();
int line = token.getLine();
int charOffset = token.getCharPositionInLine();

listener.onError(new PdePreprocessIssue(
line,
charOffset,
PreprocessIssueMessageSimplifier.getLocalStr(
"editor.status.bad.mixed_mode"
)
));
});
}

/**
* Endpoint for ANTLR to call when finished parsing a method invocatino.
*
Expand Down Expand Up @@ -770,7 +787,7 @@ protected boolean calledFromGlobalOrSetup(ParserRuleContext callContext) {
* @return True if setup and false otherwise.
*/
protected boolean isMethodSetup(ParserRuleContext declaration) {
if (declaration.getChildCount() < 2) {
if (declaration == null || declaration.getChildCount() < 2) {
return false;
}
return declaration.getChild(1).getText().equals("setup");
Expand Down
11 changes: 9 additions & 2 deletions java/src/processing/mode/java/preproc/Processing.g4
Original file line number Diff line number Diff line change
Expand Up @@ -23,27 +23,34 @@ processingSketch
: javaProcessingSketch
| staticProcessingSketch
| activeProcessingSketch
| warnMixedModes
;

// java mode, is a compilation unit
javaProcessingSketch
: packageDeclaration? importDeclaration* typeDeclaration+ EOF
;

// No method declarations, just statements
staticProcessingSketch
: (importDeclaration | blockStatement)* EOF
;

// active mode, has function definitions
activeProcessingSketch
: (importDeclaration | classBodyDeclaration)* EOF
;
: (importDeclaration | classBodyDeclaration)* EOF
;

variableDeclaratorId
: warnTypeAsVariableName
| IDENTIFIER ('[' ']')*
;

warnMixedModes
: (importDeclaration | classBodyDeclaration | blockStatement)* blockStatement classBodyDeclaration (importDeclaration | classBodyDeclaration | blockStatement)*
| (importDeclaration | classBodyDeclaration | blockStatement)* classBodyDeclaration blockStatement (importDeclaration | classBodyDeclaration | blockStatement)*
;

// bug #93
// https://github.com/processing/processing/issues/93
// prevent from types being used as variable names
Expand Down
5 changes: 5 additions & 0 deletions java/test/processing/mode/java/ParserTests.java
Original file line number Diff line number Diff line change
Expand Up @@ -405,4 +405,9 @@ public void testSizeThis() {
expectGood("sizethis");
}

@Test
public void testMixing() {
expectRunnerException("mixing", 1);
}

}

0 comments on commit 0f9b290

Please sign in to comment.