Search in sources :

Example 1 with ParseResult

use of org.eclipse.xtext.parser.ParseResult in project xtext-core by eclipse.

the class AbstractInternalAntlrParser method parse.

public final IParseResult parse(String entryRuleName) throws RecognitionException {
    long time = System.currentTimeMillis();
    IParseResult result = null;
    EObject current = null;
    String completeContent = input.toString();
    if (// who had the crazy idea to return null from toString() ...
    completeContent == null)
        completeContent = "";
    currentNode = nodeBuilder.newRootNode(completeContent);
    String antlrEntryRuleName = normalizeEntryRuleName(entryRuleName);
    try {
        Method method = this.getClass().getMethod(antlrEntryRuleName);
        method.setAccessible(true);
        Object parseResult = method.invoke(this);
        if (parseResult instanceof EObject)
            current = (EObject) parseResult;
        appendSkippedTokens();
        appendTrailingHiddenTokens();
        try {
            appendAllTokens();
        } finally {
            ICompositeNode root = nodeBuilder.compressAndReturnParent(currentNode);
            result = new ParseResult(current, root, hadErrors);
        }
    } catch (InvocationTargetException ite) {
        Throwable targetException = ite.getTargetException();
        if (targetException instanceof RecognitionException) {
            try {
                appendAllTokens();
            } finally {
                ICompositeNode root = nodeBuilder.compressAndReturnParent(currentNode);
                result = new ParseResult(current, root, hadErrors);
            }
            throw (RecognitionException) targetException;
        }
        if (targetException instanceof Exception) {
            throw new WrappedException((Exception) targetException);
        }
        throw new RuntimeException(targetException);
    } catch (Exception e) {
        throw new WrappedException(e);
    } finally {
        if (logger.isDebugEnabled()) {
            logger.debug("Parsing took: " + (System.currentTimeMillis() - time) + " ms");
        }
    }
    return result;
}
Also used : WrappedException(org.eclipse.emf.common.util.WrappedException) IParseResult(org.eclipse.xtext.parser.IParseResult) ParseResult(org.eclipse.xtext.parser.ParseResult) Method(java.lang.reflect.Method) InvocationTargetException(java.lang.reflect.InvocationTargetException) MissingTokenException(org.antlr.runtime.MissingTokenException) RecognitionException(org.antlr.runtime.RecognitionException) ValueConverterException(org.eclipse.xtext.conversion.ValueConverterException) UnwantedTokenException(org.antlr.runtime.UnwantedTokenException) WrappedException(org.eclipse.emf.common.util.WrappedException) InvocationTargetException(java.lang.reflect.InvocationTargetException) FailedPredicateException(org.antlr.runtime.FailedPredicateException) MismatchedTokenException(org.antlr.runtime.MismatchedTokenException) EObject(org.eclipse.emf.ecore.EObject) ICompositeNode(org.eclipse.xtext.nodemodel.ICompositeNode) EObject(org.eclipse.emf.ecore.EObject) IParseResult(org.eclipse.xtext.parser.IParseResult) RecognitionException(org.antlr.runtime.RecognitionException)

Example 2 with ParseResult

use of org.eclipse.xtext.parser.ParseResult in project xtext-core by eclipse.

the class PartialParsingHelper method reparse.

@Override
@SuppressWarnings({ "unchecked", "rawtypes" })
public IParseResult reparse(IParser parser, IParseResult previousParseResult, ReplaceRegion changedRegion) {
    if (parser == null)
        throw new NullPointerException("parser may not be null");
    if (previousParseResult == null) {
        throw new NullPointerException("previousParseResult and previousParseResult.rootNode may not be null");
    }
    ICompositeNode oldRootNode = previousParseResult.getRootNode();
    if (changedRegion.getEndOffset() > oldRootNode.getTotalLength()) {
        log.error("Invalid " + changedRegion + " originalLength=" + oldRootNode.getTotalLength());
        return fullyReparse(parser, previousParseResult, changedRegion);
    }
    if (changedRegion.getOffset() >= oldRootNode.getTotalLength() && changedRegion.getText().trim().length() == 0) {
        return fullyReparse(parser, previousParseResult, changedRegion);
    }
    ReplaceRegion replaceRegion;
    if (tokenRegionProvider != null) {
        replaceRegion = tokenRegionProvider.getTokenReplaceRegion(insertChangeIntoReplaceRegion(oldRootNode, changedRegion), changedRegion);
    } else {
        replaceRegion = changedRegion;
    }
    if (isNullEdit(oldRootNode, replaceRegion)) {
        return previousParseResult;
    }
    PartialParsingPointers parsingPointers = calculatePartialParsingPointers(previousParseResult, replaceRegion.getOffset(), replaceRegion.getLength());
    List<ICompositeNode> validReplaceRootNodes = parsingPointers.getValidReplaceRootNodes();
    ICompositeNode oldCompositeNode = null;
    String reparseRegion = "";
    for (int i = validReplaceRootNodes.size() - 1; i >= 0; --i) {
        oldCompositeNode = validReplaceRootNodes.get(i);
        if (!(oldCompositeNode instanceof SyntheticCompositeNode) && !isRangePartOfExceedingLookAhead((CompositeNode) oldCompositeNode, replaceRegion)) {
            boolean replaceAtEnd = oldCompositeNode.getTotalEndOffset() == replaceRegion.getEndOffset();
            reparseRegion = insertChangeIntoReplaceRegion(oldCompositeNode, replaceRegion);
            if (!"".equals(reparseRegion)) {
                if (!replaceAtEnd || !Character.isWhitespace(reparseRegion.charAt(reparseRegion.length() - 1))) {
                    if (log.isDebugEnabled()) {
                        log.debug("replace region: [" + oldCompositeNode.getTotalOffset() + " / length: " + oldCompositeNode.getTotalLength() + " of [" + oldRootNode.getTotalOffset() + " / lenght: " + oldRootNode.getTotalLength() + "]");
                    }
                    break;
                }
            }
        }
    }
    if (oldCompositeNode == null || reparseRegion.equals("") || oldCompositeNode == oldRootNode) {
        return fullyReparse(parser, previousParseResult, replaceRegion);
    }
    EObject entryRuleOrRuleCall = parsingPointers.findEntryRuleOrRuleCall(oldCompositeNode);
    IParseResult newParseResult = null;
    try {
        if (entryRuleOrRuleCall instanceof RuleCall)
            newParseResult = parser.parse((RuleCall) entryRuleOrRuleCall, new StringReader(reparseRegion), oldCompositeNode.getLookAhead());
        else
            newParseResult = parser.parse((ParserRule) entryRuleOrRuleCall, new StringReader(reparseRegion));
    } catch (ParseException exc) {
    }
    if (newParseResult == null || newParseResult.hasSyntaxErrors()) {
        // on error fully reparse
        return fullyReparse(parser, previousParseResult, replaceRegion);
    }
    if (oldRootNode.equals(oldCompositeNode)) {
        unloadSemanticObject(previousParseResult.getRootASTElement());
        return newParseResult;
    }
    EObject oldSemanticParentElement = oldCompositeNode.getParent().getSemanticElement();
    EObject oldSemanticElement = null;
    if (oldCompositeNode.hasDirectSemanticElement()) {
        oldSemanticElement = oldCompositeNode.getSemanticElement();
    } else {
        List<ICompositeNode> nodesEnclosingRegion = parsingPointers.getNodesEnclosingRegion();
        for (int i = nodesEnclosingRegion.size() - 1; i >= 0; --i) {
            ICompositeNode enclosingNode = nodesEnclosingRegion.get(i);
            if (enclosingNode == oldCompositeNode) {
                break;
            }
            if (enclosingNode.hasDirectSemanticElement())
                oldSemanticElement = enclosingNode.getSemanticElement();
        }
        if (oldSemanticElement == null)
            return fullyReparse(parser, previousParseResult, replaceRegion);
    }
    if (oldSemanticElement == oldSemanticParentElement) {
        throw new IllegalStateException("oldParent == oldElement");
    }
    if (oldSemanticParentElement != null) {
        EStructuralFeature feature = oldSemanticElement.eContainingFeature();
        if (feature == null)
            return fullyReparse(parser, previousParseResult, replaceRegion);
        oldSemanticParentElement = oldSemanticElement.eContainer();
        if (feature.isMany()) {
            List featureValueList = (List) oldSemanticParentElement.eGet(feature);
            int index = featureValueList.indexOf(oldSemanticElement);
            unloadSemanticObject(oldSemanticElement);
            EObject newSemanticObject = newParseResult.getRootASTElement();
            if (newSemanticObject != null) {
                featureValueList.set(index, newParseResult.getRootASTElement());
            } else {
                featureValueList.remove(index);
            }
        } else {
            unloadSemanticObject(oldSemanticElement);
            oldSemanticParentElement.eSet(feature, newParseResult.getRootASTElement());
        }
        ((ParseResult) newParseResult).setRootASTElement(previousParseResult.getRootASTElement());
    } else {
        unloadSemanticObject(oldSemanticElement);
    }
    if (oldCompositeNode != oldRootNode) {
        nodeModelBuilder.replaceAndTransferLookAhead(oldCompositeNode, newParseResult.getRootNode());
        ((ParseResult) newParseResult).setRootNode(oldRootNode);
        StringBuilder builder = new StringBuilder(oldRootNode.getText());
        replaceRegion.applyTo(builder);
        nodeModelBuilder.setCompleteContent(oldRootNode, builder.toString());
    }
    return newParseResult;
}
Also used : SyntheticCompositeNode(org.eclipse.xtext.nodemodel.impl.SyntheticCompositeNode) ParseResult(org.eclipse.xtext.parser.ParseResult) IParseResult(org.eclipse.xtext.parser.IParseResult) EStructuralFeature(org.eclipse.emf.ecore.EStructuralFeature) RuleCall(org.eclipse.xtext.RuleCall) ReplaceRegion(org.eclipse.xtext.util.ReplaceRegion) EObject(org.eclipse.emf.ecore.EObject) StringReader(java.io.StringReader) ICompositeNode(org.eclipse.xtext.nodemodel.ICompositeNode) ArrayList(java.util.ArrayList) List(java.util.List) IParseResult(org.eclipse.xtext.parser.IParseResult) ParseException(org.eclipse.xtext.parser.ParseException)

Example 3 with ParseResult

use of org.eclipse.xtext.parser.ParseResult in project xtext-core by eclipse.

the class ResourceStorageLoadable method readNodeModel.

protected void readNodeModel(final StorageAwareResource resource, final InputStream inputStream) throws IOException {
    final SerializableNodeModel serializableNodeModel = new SerializableNodeModel(resource);
    boolean _exists = resource.getResourceSet().getURIConverter().exists(resource.getURI(), resource.getResourceSet().getLoadOptions());
    boolean _not = (!_exists);
    if (_not) {
        URI _uRI = resource.getURI();
        String _plus = ("Skipping loading node model for synthetic resource " + _uRI);
        ResourceStorageLoadable.LOG.info(_plus);
        return;
    }
    final InputStream stream = resource.getResourceSet().getURIConverter().createInputStream(resource.getURI());
    String _encoding = resource.getEncoding();
    final InputStreamReader in = new InputStreamReader(stream, _encoding);
    final String completeContent = CharStreams.toString(in);
    final DeserializationConversionContext deserializationContext = new DeserializationConversionContext(resource, completeContent);
    final DataInputStream dataIn = new DataInputStream(inputStream);
    serializableNodeModel.readObjectData(dataIn, deserializationContext);
    EObject _head = IterableExtensions.<EObject>head(resource.getContents());
    boolean _hasErrors = deserializationContext.hasErrors();
    ParseResult _parseResult = new ParseResult(_head, serializableNodeModel.root, _hasErrors);
    resource.setParseResult(_parseResult);
}
Also used : DeserializationConversionContext(org.eclipse.xtext.nodemodel.serialization.DeserializationConversionContext) InputStreamReader(java.io.InputStreamReader) ParseResult(org.eclipse.xtext.parser.ParseResult) DataInputStream(java.io.DataInputStream) BufferedInputStream(java.io.BufferedInputStream) ZipInputStream(java.util.zip.ZipInputStream) ObjectInputStream(java.io.ObjectInputStream) InputStream(java.io.InputStream) SerializableNodeModel(org.eclipse.xtext.nodemodel.impl.SerializableNodeModel) EObject(org.eclipse.emf.ecore.EObject) InternalEObject(org.eclipse.emf.ecore.InternalEObject) DataInputStream(java.io.DataInputStream) URI(org.eclipse.emf.common.util.URI)

Aggregations

EObject (org.eclipse.emf.ecore.EObject)3 ParseResult (org.eclipse.xtext.parser.ParseResult)3 ICompositeNode (org.eclipse.xtext.nodemodel.ICompositeNode)2 IParseResult (org.eclipse.xtext.parser.IParseResult)2 BufferedInputStream (java.io.BufferedInputStream)1 DataInputStream (java.io.DataInputStream)1 InputStream (java.io.InputStream)1 InputStreamReader (java.io.InputStreamReader)1 ObjectInputStream (java.io.ObjectInputStream)1 StringReader (java.io.StringReader)1 InvocationTargetException (java.lang.reflect.InvocationTargetException)1 Method (java.lang.reflect.Method)1 ArrayList (java.util.ArrayList)1 List (java.util.List)1 ZipInputStream (java.util.zip.ZipInputStream)1 FailedPredicateException (org.antlr.runtime.FailedPredicateException)1 MismatchedTokenException (org.antlr.runtime.MismatchedTokenException)1 MissingTokenException (org.antlr.runtime.MissingTokenException)1 RecognitionException (org.antlr.runtime.RecognitionException)1 UnwantedTokenException (org.antlr.runtime.UnwantedTokenException)1