/******************************************************************************* * Copyright (c) 2014 Bruno Medeiros and other Contributors. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Bruno Medeiros - initial API and implementation *******************************************************************************/ package dtool.engine.analysis; import static dtool.engine.analysis.DeeLanguageIntrinsics.D2_063_intrinsics; import static melnorme.utilbox.core.Assert.AssertNamespace.assertTrue; import melnorme.lang.tooling.ast.ASTNodeFinder; import melnorme.lang.tooling.ast_actual.ASTNode; import melnorme.lang.tooling.context.ISemanticContext; import melnorme.lang.tooling.engine.PickedElement; import melnorme.lang.tooling.engine.intrinsics.CommonLanguageIntrinsics.IntrinsicProperty; import melnorme.lang.tooling.engine.intrinsics.CommonLanguageIntrinsics.IntrinsicProperty2; import melnorme.lang.tooling.symbols.IConcreteNamedElement; import melnorme.lang.tooling.symbols.INamedElement; import dtool.ast.definitions.DefSymbol; import dtool.ast.definitions.Module; import dtool.ast.references.RefIdentifier; import dtool.engine.ResolvedModule; import dtool.engine.StandardLibraryResolution; // TODO: remove this class, create specific tests for each remaining NamedElement. public class NE__OthersTest extends NamedElement_CommonTest { /* ----------------- helpers to create elements ----------------- */ protected static String func(String string) { return "void func() { " + string + " }"; } protected static PickedElement<INamedElement> parseDefUnit(String source) { return parseDefUnit(source, "xxx"); } public static PickedElement<INamedElement> parseDefUnit(String source, String markerString) { int offset = source.indexOf(markerString); ResolvedModule semanticModule = parseModule_(source); Module module = semanticModule.getModuleNode(); ASTNode node = ASTNodeFinder.findElement(module, offset); DefSymbol name = assertCast(node, DefSymbol.class); return pickedElement(name.getDefUnit(), semanticModule.getSemanticContext()); } public static PickedElement<INamedElement> pickedElement(INamedElement namedElement, ISemanticContext context) { return new PickedElement<>(namedElement, context); } /* ----------------- Sample elements ----------------- */ /** Helper to visit a sample of named elements. */ protected static class NamedElementVisitor { protected final void visit(PickedElement<INamedElement> pickedElement, String aliasTarget) { INamedElement namedElement = pickedElement.element; boolean isConcrete = aliasTarget == null; assertTrue((namedElement instanceof IConcreteNamedElement) == isConcrete); assertTrue(isConcrete || namedElement.getName().equals("xxx") || namedElement.getName().equals(aliasTarget)); doVisit(pickedElement, aliasTarget); } @SuppressWarnings("unused") protected void doVisit(PickedElement<INamedElement> pickedElement, String aliasTarget) { } protected final void visitConcrete(PickedElement<INamedElement> pickedElement) { visit(pickedElement, null); } protected final void visitAliasElement(PickedElement<INamedElement> pickedElement) { visitAliasElement(pickedElement, "target"); } protected final void visitAliasElement(PickedElement<INamedElement> pickedElement, String aliasTarget) { visit(pickedElement, aliasTarget); } public void visitElements() throws Exception { visitConcrete(parseDefUnit("void func() { if(int xxx) { } }")); visitConcrete(parseDefUnit("void func(int xxx) { }")); visitConcrete(parseDefUnit("static this() { }", "this")); visitConcrete(parseDefUnit(func(" try {} catch(Exception xxx) {} "))); visitConcrete(parseDefUnit(func(" foreach(a , xxx ; [1, 2 3]);"))); StandardLibraryResolution stdLib = getDefaultStdLibContext(); visitConcrete(pickedElement(new IntrinsicProperty("max", D2_063_intrinsics.int_type, null), stdLib)); visitConcrete(pickedElement(new IntrinsicProperty2("max", new RefIdentifier("blah"), null), stdLib)); visitConcrete(parseDefUnit("mixin blah xxx;")); visitAliasElement(parseDefUnit("int target; static if(is(target xxx)) { }"), "int target;"); } } /* ----------------- ----------------- */ @Override public void test_NamedElement________() throws Exception { new NamedElementVisitor() { @Override protected void doVisit(PickedElement<INamedElement> pickedElement, String aliasTarget) { /* TODO: test resolved type as well*/ test_resolveConcreteElement(pickedElement, aliasTarget); } }.visitElements(); } }