From cb714898aa1cba3a782ba062c8e561442979e9ca Mon Sep 17 00:00:00 2001 From: Frerich Raabe Date: Fri, 7 Apr 2017 08:45:27 +0200 Subject: [PATCH 1/2] Introduced org.epic.perleditor.tokenHandler extension point This extension point allows monitoring the parsing process when processing Perl scripts such that custom bookkeeping can be performed. --- org.epic.perleditor/plugin.xml | 1 + org.epic.perleditor/schema/tokenHandler.exsd | 102 ++++++++++++++++++ .../org/epic/core/model/ITokenHandler.java | 14 +++ .../src/org/epic/core/model/SourceFile.java | 37 ++++++- 4 files changed, 152 insertions(+), 2 deletions(-) create mode 100644 org.epic.perleditor/schema/tokenHandler.exsd create mode 100644 org.epic.perleditor/src/org/epic/core/model/ITokenHandler.java diff --git a/org.epic.perleditor/plugin.xml b/org.epic.perleditor/plugin.xml index ba86c6bb..47d0eeb6 100644 --- a/org.epic.perleditor/plugin.xml +++ b/org.epic.perleditor/plugin.xml @@ -1,6 +1,7 @@ + + + + + + + + + Allows observing the Perl parsing process. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [Enter the first release in which this extension point appears.] + + + + + + + + + [Enter extension point usage example here.] + + + + + + + + + [Enter API information here.] + + + + + + + + + [Enter information about supplied implementation of this extension point.] + + + + + diff --git a/org.epic.perleditor/src/org/epic/core/model/ITokenHandler.java b/org.epic.perleditor/src/org/epic/core/model/ITokenHandler.java new file mode 100644 index 00000000..93519a09 --- /dev/null +++ b/org.epic.perleditor/src/org/epic/core/model/ITokenHandler.java @@ -0,0 +1,14 @@ +package org.epic.core.model; + +import java.util.List; + +import org.epic.core.parser.PerlToken; + +public interface ITokenHandler +{ + + void start(SourceFile sourceFile, List tokens); + void end(); + void handleToken(int currentTokenIdx); + +} diff --git a/org.epic.perleditor/src/org/epic/core/model/SourceFile.java b/org.epic.perleditor/src/org/epic/core/model/SourceFile.java index 10c1ff0e..d8eb278a 100644 --- a/org.epic.perleditor/src/org/epic/core/model/SourceFile.java +++ b/org.epic.perleditor/src/org/epic/core/model/SourceFile.java @@ -24,6 +24,7 @@ public class SourceFile private final IDocument doc; private List pods; private List packages; + private List tokenHandlers; /** * Creates a SourceFile which will be reflecting contents of the given @@ -38,6 +39,21 @@ public SourceFile(ILog log, IDocument doc) this.doc = doc; this.pods = Collections.emptyList(); this.packages = Collections.emptyList(); + + this.tokenHandlers = new ArrayList(); + IConfigurationElement[] config = Platform.getExtensionRegistry().getConfigurationElementsFor("org.epic.perleditor.tokenHandler"); + for (IConfigurationElement cfg: config) { + Object handler; + try { + handler = cfg.createExecutableExtension("class"); + if (handler instanceof ITokenHandler) { + tokenHandlers.add((ITokenHandler)handler); + } + } catch (CoreException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } } /** @@ -109,7 +125,12 @@ public synchronized void parse() { try { - ParsingState state = new ParsingState(partitioner.getTokens()); + List tokens = partitioner.getTokens(); + ParsingState state = new ParsingState(tokens, tokenHandlers); + + for (ITokenHandler handler: tokenHandlers) { + handler.start(this, tokens); + } while (state.hasMoreTokens()) state.processToken(); state.finish(); @@ -125,6 +146,12 @@ public synchronized void parse() "in plug-in " + PerlEditorPlugin.getPluginId(), e)); } + finally + { + for (ITokenHandler handler: tokenHandlers) { + handler.end(); + } + } } fireSourceFileChanged(); } @@ -160,6 +187,7 @@ private class ParsingState private int type; private int blockLevel; private boolean afterEnd; + private List tokenHandlers; private Stack pkgStack; private Stack subStack; @@ -171,10 +199,11 @@ private class ParsingState private boolean inSubProto; private PerlToken baseKeyword; - public ParsingState(List tokens) + public ParsingState(List tokens, List tokenHandlers) { this.tIndex = 0; this.tokens = tokens; + this.tokenHandlers = tokenHandlers; this.tokenCount = tokens.size(); this.pkgStack = new Stack(); this.subStack = new Stack(); @@ -196,6 +225,10 @@ public void processToken() throws BadLocationException this.t = tokens.get(tIndex); this.type = t.getType(); + for (ITokenHandler handler: tokenHandlers) { + handler.handleToken(tIndex); + } + if (this.type == PerlTokenTypes.END) { afterEnd = true; From 78d8f2a2524f430759cf11cfc25c17c11b7457bc Mon Sep 17 00:00:00 2001 From: Frerich Raabe Date: Fri, 7 Apr 2017 16:15:26 +0200 Subject: [PATCH 2/2] Improved logging in case tokenHandler extensions fails That way the errors are written to Eclipse' workspace log file and show up in the Error Log View in Eclipse itself too. --- org.epic.perleditor/src/org/epic/core/model/SourceFile.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/org.epic.perleditor/src/org/epic/core/model/SourceFile.java b/org.epic.perleditor/src/org/epic/core/model/SourceFile.java index d8eb278a..f0413b57 100644 --- a/org.epic.perleditor/src/org/epic/core/model/SourceFile.java +++ b/org.epic.perleditor/src/org/epic/core/model/SourceFile.java @@ -50,8 +50,9 @@ public SourceFile(ILog log, IDocument doc) tokenHandlers.add((ITokenHandler)handler); } } catch (CoreException e) { - // TODO Auto-generated catch block - e.printStackTrace(); + PerlEditorPlugin.getDefault().getLog().log( + new Status(IStatus.WARNING, PerlEditorPlugin.getUniqueIdentifier(), + "failed to load tokenHandler extension", e)); } } }