[xtext] Some additional guards against NPEs

This commit is contained in:
Sebastian Zarnekow 2012-03-09 15:41:47 +01:00
parent e423c58a00
commit 5f3f3a640c
5 changed files with 36 additions and 27 deletions

View file

@ -466,7 +466,7 @@ public class PartialParsingHelper implements IPartialParsingHelper {
EObject semanticElement = NodeModelUtils.findActualSemanticObjectFor(node);
if (semanticElement != null) {
ICompositeNode actualNode = NodeModelUtils.findActualNodeFor(semanticElement);
if (actualNode.getTotalOffset() < node.getTotalOffset() || actualNode.getTotalEndOffset() > node.getTotalEndOffset())
if (actualNode != null && (actualNode.getTotalOffset() < node.getTotalOffset() || actualNode.getTotalEndOffset() > node.getTotalEndOffset()))
process = false;
}
if (process) {

View file

@ -133,21 +133,23 @@ public class EObjectAtOffsetHelper {
protected EObject resolveCrossReferencedElement(INode node) {
EObject referenceOwner = NodeModelUtils.findActualSemanticObjectFor(node);
EReference crossReference = GrammarUtil.getReference((CrossReference) node.getGrammarElement(),
referenceOwner.eClass());
if (!crossReference.isMany()) {
return (EObject) referenceOwner.eGet(crossReference);
} else {
List<?> listValue = (List<?>) referenceOwner.eGet(crossReference);
List<INode> nodesForFeature = NodeModelUtils.findNodesForFeature(referenceOwner, crossReference);
int currentIndex = 0;
for (INode nodeForFeature : nodesForFeature) {
if (currentIndex >= listValue.size())
return null;
if (nodeForFeature.getTotalOffset() <= node.getTotalOffset()
&& nodeForFeature.getTotalEndOffset() >= node.getTotalEndOffset())
return (EObject) listValue.get(currentIndex);
currentIndex++;
if (referenceOwner != null) {
EReference crossReference = GrammarUtil.getReference((CrossReference) node.getGrammarElement(),
referenceOwner.eClass());
if (!crossReference.isMany()) {
return (EObject) referenceOwner.eGet(crossReference);
} else {
List<?> listValue = (List<?>) referenceOwner.eGet(crossReference);
List<INode> nodesForFeature = NodeModelUtils.findNodesForFeature(referenceOwner, crossReference);
int currentIndex = 0;
for (INode nodeForFeature : nodesForFeature) {
if (currentIndex >= listValue.size())
return null;
if (nodeForFeature.getTotalOffset() <= node.getTotalOffset()
&& nodeForFeature.getTotalEndOffset() >= node.getTotalEndOffset())
return (EObject) listValue.get(currentIndex);
currentIndex++;
}
}
}
return null;

View file

@ -132,6 +132,9 @@ public class Serializer implements ISerializer {
public ReplaceRegion serializeReplacement(EObject obj, SaveOptions options) {
ICompositeNode node = NodeModelUtils.findActualNodeFor(obj);
if (node == null) {
throw new IllegalStateException("Cannot replace an obj that has no associated node");
}
String text = serialize(obj);
return new ReplaceRegion(node.getTotalOffset(), node.getTotalLength(), text);
}

View file

@ -133,14 +133,16 @@ public class NodeModelSemanticSequencer extends AbstractSemanticSequencer {
private INode findContextNode(EObject semanticObject) {
INode node = NodeModelUtils.findActualNodeFor(semanticObject);
BidiIterator<INode> nodes = node.getAsTreeIterable().iterator();
while (nodes.hasNext()) {
INode next = nodes.next();
if (next.getGrammarElement() instanceof RuleCall)
return next;
if (next.getGrammarElement() instanceof ParserRule
&& ((ParserRule) next.getGrammarElement()).getType().getClassifier() instanceof EClass)
return next;
if (node != null) {
BidiIterator<INode> nodes = node.getAsTreeIterable().iterator();
while (nodes.hasNext()) {
INode next = nodes.next();
if (next.getGrammarElement() instanceof RuleCall)
return next;
if (next.getGrammarElement() instanceof ParserRule
&& ((ParserRule) next.getGrammarElement()).getType().getClassifier() instanceof EClass)
return next;
}
}
throw new RuntimeException("no context found");
}

View file

@ -119,10 +119,12 @@ public class DiagnosticConverterImpl implements IDiagnosticConverter {
if (diagnostic instanceof RangeBasedDiagnostic) {
RangeBasedDiagnostic castedDiagnostic = (RangeBasedDiagnostic) diagnostic;
INode parserNode = NodeModelUtils.getNode(causer);
String completeText = parserNode.getRootNode().getText();
int startLine = Strings.countLines(completeText.substring(0, castedDiagnostic.getOffset())) + 1;
IssueLocation result = new IssueLocation();
result.lineNumber = startLine;
if (parserNode != null) {
String completeText = parserNode.getRootNode().getText();
int startLine = Strings.countLines(completeText.substring(0, castedDiagnostic.getOffset())) + 1;
result.lineNumber = startLine;
}
result.offset = castedDiagnostic.getOffset();
result.length = castedDiagnostic.getLength();
return result;