mirror of
https://github.com/sigmasternchen/xtext-core
synced 2025-03-16 16:58:56 +00:00
[xtext] Some additional guards against NPEs
This commit is contained in:
parent
e423c58a00
commit
5f3f3a640c
5 changed files with 36 additions and 27 deletions
|
@ -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) {
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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");
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue