/*
* Copyright (c) 2012 Sam Harwell, Tunnel Vision Laboratories LLC
* All rights reserved.
*
* The source code of this document is proprietary work, and is not licensed for
* distribution. For information about licensing, contact Sam Harwell at:
* sam@tunnelvisionlabs.com
*/
package org.antlr.works.editor.grammar.debugger;
import java.util.Collection;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.antlr.netbeans.editor.classification.TokenTag;
import org.antlr.netbeans.editor.tagging.Tagger;
import org.antlr.netbeans.editor.text.DocumentSnapshot;
import org.antlr.netbeans.parsing.spi.ParserData;
import org.antlr.netbeans.parsing.spi.ParserDataDefinition;
import org.antlr.netbeans.parsing.spi.ParserDataOptions;
import org.antlr.netbeans.parsing.spi.ParserTaskManager;
import org.antlr.netbeans.parsing.spi.ParserTaskScheduler;
import org.antlr.v4.runtime.ParserRuleContext;
import org.antlr.v4.runtime.Token;
import org.netbeans.api.editor.mimelookup.MimeRegistration;
/**
*
* @author Sam Harwell
*/
public class ParserDebuggerParserDataDefinitions {
private static final Logger LOGGER = Logger.getLogger(ParserDebuggerParserDataDefinitions.class.getName());
public static final ParserDataDefinition<FileParseResult> FILE_PARSE_RESULT = new FileParseResultDataDefinition();
public static final ParserDataDefinition<ParserRuleContext> REFERENCE_PARSE_TREE = new ReferenceParseTreeDataDefinition();
public static final ParserDataDefinition<Tagger<TokenTag<Token>>> LEXER_TOKENS = new LexerTokensDataDefinition();
public static final ParserDataDefinition<Boolean> PARSE_TREE_UI_VISIBLE = new ParseTreeUIVisibleDataDefinition();
private ParserDebuggerParserDataDefinitions() {
}
public static <T> T tryGetData(ParserTaskManager taskManager, DocumentSnapshot snapshot, ParserDataDefinition<T> definition, Collection<ParserDataOptions> options) {
Future<ParserData<T>> futureData = taskManager.getData(snapshot, definition, options);
if (futureData == null) {
return null;
}
try {
ParserData<T> parserData = futureData.get();
if (parserData == null) {
return null;
}
return parserData.getData();
} catch (InterruptedException | ExecutionException ex) {
if (LOGGER.isLoggable(Level.FINE)) {
LOGGER.log(Level.FINE, String.format("An exception occurred while parsing '%s' data.", definition.getName()), ex);
}
}
return null;
}
@MimeRegistration(mimeType=ParserDebuggerEditorKit.PARSER_DEBUGGER_MIME_TYPE, service=ParserDataDefinition.class)
public static ParserDataDefinition<FileParseResult> getFileParseResultDataDefinition() {
return FILE_PARSE_RESULT;
}
@MimeRegistration(mimeType=ParserDebuggerEditorKit.PARSER_DEBUGGER_MIME_TYPE, service=ParserDataDefinition.class)
public static ParserDataDefinition<ParserRuleContext> getReferenceParseTreeDataDefinition() {
return REFERENCE_PARSE_TREE;
}
@MimeRegistration(mimeType=ParserDebuggerEditorKit.PARSER_DEBUGGER_MIME_TYPE, service=ParserDataDefinition.class)
public static ParserDataDefinition<Tagger<TokenTag<Token>>> getLexerTokensDataDefinition() {
return LEXER_TOKENS;
}
private static final class FileParseResultDataDefinition extends ParserDataDefinition<FileParseResult> {
public FileParseResultDataDefinition() {
super("Parser Debugger File Parse Result", FileParseResult.class, false, true, ParserTaskScheduler.CONTENT_SENSITIVE_TASK_SCHEDULER);
}
}
private static final class ReferenceParseTreeDataDefinition extends ParserDataDefinition<ParserRuleContext> {
public ReferenceParseTreeDataDefinition() {
super("Parser Debugger Reference Parse Tree", ParserRuleContext.class, false, true, ParserTaskScheduler.CONTENT_SENSITIVE_TASK_SCHEDULER);
}
}
private static final class LexerTokensDataDefinition extends ParserDataDefinition<Tagger<TokenTag<Token>>> {
@SuppressWarnings("unchecked")
public LexerTokensDataDefinition() {
super("Parser Debugger Lexer Tokens", (Class<Tagger<TokenTag<Token>>>)(Object)Tagger.class, false, true, ParserTaskScheduler.CONTENT_SENSITIVE_TASK_SCHEDULER);
}
}
private static final class ParseTreeUIVisibleDataDefinition extends ParserDataDefinition<Boolean> {
public ParseTreeUIVisibleDataDefinition() {
super("Parse Tree UI Visible", Boolean.class, false, false, ParserTaskScheduler.MANUAL_TASK_SCHEDULER);
}
}
}