use of org.eclipse.n4js.flowgraphs.N4JSFlowAnalyser in project n4js by eclipse.
the class N4JSFlowgraphValidator method checkFlowGraphs.
/**
* Triggers all flow graph related validations
*/
@Check
public void checkFlowGraphs(Script script) {
// Note: The Flow Graph is NOT stored in the meta info cache. Hence, it is created here at use site.
// In case the its creation is moved to the N4JSPostProcessor, care about an increase in memory consumption.
N4JSFlowAnalyser flowAnalyzer = new N4JSFlowAnalyser(this::checkCancelled);
FlowValidator[] fValidators = { new DeadCodeValidator(keywordProvider), new UsedBeforeDeclaredValidator(), new NullUndefinedValidator(n4jsCore, findReferenceHelper), new MissingReturnOrThrowValidator(typeSystemHelper, jsVariantHelper) };
FlowAnalyser[] fAnalysers = new FlowAnalyser[fValidators.length];
for (int i = 0; i < fValidators.length; i++) {
fAnalysers[i] = fValidators[i].getFlowAnalyser();
}
flowAnalyzer.createGraphs(script);
flowAnalyzer.accept(fAnalysers);
String uriString = script.eResource().getURI().toString();
try (ClosableMeasurement m1 = dcFlowGraphs.getClosableMeasurement("flowGraphs_" + uriString);
ClosableMeasurement m2 = dcPostprocessing.getClosableMeasurement("createGraph_" + uriString)) {
for (FlowValidator fValidator : fValidators) {
fValidator.checkResults(this);
}
}
}
use of org.eclipse.n4js.flowgraphs.N4JSFlowAnalyser in project n4js by eclipse.
the class FlowgraphsXpectMethod method filterByControlFlowType.
private void filterByControlFlowType(ControlFlowElement start, Collection<ControlFlowElement> succList, ControlFlowType cfType) {
if (cfType == null)
return;
for (Iterator<ControlFlowElement> succIt = succList.iterator(); succIt.hasNext(); ) {
N4JSFlowAnalyser flowAnalyzer = getFlowAnalyzer(start);
Set<ControlFlowType> currCFTypes = flowAnalyzer.getControlFlowTypeToSuccessors(start, succIt.next());
if (!currCFTypes.contains(cfType)) {
succIt.remove();
}
}
}
use of org.eclipse.n4js.flowgraphs.N4JSFlowAnalyser in project n4js by eclipse.
the class FlowgraphsXpectMethod method getFlowAnalyzer.
N4JSFlowAnalyser getFlowAnalyzer(EObject eo) {
Script script = EcoreUtil2.getContainerOfType(eo, Script.class);
N4JSFlowAnalyser flowAnalyzer = new N4JSFlowAnalyser();
flowAnalyzer.createGraphs(script);
return flowAnalyzer;
}
use of org.eclipse.n4js.flowgraphs.N4JSFlowAnalyser in project n4js by eclipse.
the class FlowgraphsXpectMethod method instanceofguard.
/**
* This xpect method can evaluate the control flow container of a given {@link ControlFlowElement}.
*/
@ParameterParser(syntax = "('of' arg1=OFFSET)? (arg2=STRING)?")
@Xpect
public void instanceofguard(@N4JSCommaSeparatedValuesExpectation IN4JSCommaSeparatedValuesExpectation expectation, IEObjectCoveringRegion offset, String holdsName) {
ControlFlowElement cfe = getCFE(offset);
GuardAssertion assertion = null;
if (holdsName != null) {
assertion = GuardAssertion.valueOf(holdsName);
}
InstanceofGuardAnalyser iga = new InstanceofGuardAnalyser();
N4JSFlowAnalyser flowAnalyzer = getFlowAnalyzer(cfe);
flowAnalyzer.accept(iga);
Collection<InstanceofGuard> ioGuards = null;
if (assertion == GuardAssertion.MayHolds) {
ioGuards = iga.getMayHoldingTypes(cfe);
} else if (assertion == GuardAssertion.NeverHolds) {
ioGuards = iga.getNeverHoldingTypes(cfe);
} else {
ioGuards = iga.getAlwaysHoldingTypes(cfe);
}
List<String> commonPredStrs = new LinkedList<>();
for (InstanceofGuard ioGuard : ioGuards) {
String symbolText = FGUtils.getSourceText(ioGuard.symbolCFE);
String typeText = FGUtils.getSourceText(ioGuard.typeIdentifier);
commonPredStrs.add(symbolText + "<:" + typeText);
}
expectation.assertEquals(commonPredStrs);
}
Aggregations