Closes #290: Support detection of mixed modes in preproc.

Make a more friendly error message when the user is mixing modes, allowing for localization of error.
This commit is contained in:
A Pottinger
2022-01-29 15:08:14 -08:00
parent efd22f8bf1
commit 0f9b290398
5 changed files with 35 additions and 4 deletions
+2 -1
View File
@@ -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'?
@@ -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...
@@ -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'?
@@ -316,6 +316,23 @@ public class PdeParseTreeListener extends ProcessingBaseListener {
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.
*
@@ -770,7 +787,7 @@ public class PdeParseTreeListener extends ProcessingBaseListener {
* @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");
@@ -23,6 +23,7 @@ processingSketch
: javaProcessingSketch
| staticProcessingSketch
| activeProcessingSketch
| warnMixedModes
;
// java mode, is a compilation unit
@@ -30,20 +31,26 @@ 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
@@ -405,4 +405,9 @@ public class ParserTests {
expectGood("sizethis");
}
@Test
public void testMixing() {
expectRunnerException("mixing", 1);
}
}