/*******************************************************************************
* 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 melnorme.utilbox.core.Assert.AssertNamespace.assertTrue;
import static melnorme.utilbox.core.CoreUtil.areEqual;
import melnorme.lang.tooling.BundlePath;
import melnorme.lang.tooling.context.ISemanticContext;
import melnorme.lang.tooling.engine.ErrorElement.NotFoundErrorElement;
import melnorme.lang.tooling.engine.PickedElement;
import melnorme.lang.tooling.engine.intrinsics.ModuleQualifiedReference;
import melnorme.lang.tooling.engine.resolver.IReference;
import melnorme.lang.tooling.engine.resolver.IResolvable;
import melnorme.lang.tooling.engine.resolver.ReferenceResult;
import melnorme.lang.tooling.engine.resolver.ReferenceSemantics;
import melnorme.lang.tooling.symbols.INamedElement;
import org.junit.Test;
import dtool.ast.references.NamedReference;
import dtool.ast.references.RefIdentifier;
import dtool.ast.references.RefModule;
import dtool.ast.references.RefPrimitive;
import dtool.engine.StandardLibraryResolution.MissingStandardLibraryResolution;
public class Resolvables_SemanticsTest extends CommonNodeSemanticsTest {
public final BundlePath LIB_FOO = bundlePath(SEMANTICS_TEST_BUNDLES, "lib_foo");
protected static final String NOT_FOUND_SpecialMarker = "not_found";
protected static PickedElement<IResolvable> pickRef(IResolvable ref, ISemanticContext context) {
return new PickedElement<>(ref, context);
}
protected static ReferenceResult testResolveElement(PickedElement<? extends NamedReference> refElement) {
NamedReference namedRef = refElement.element;
String expectedName = namedRef.getCoreReferenceName();
if(namedRef instanceof RefModule) {
RefModule refModule = (RefModule) refElement.element;
expectedName = refModule.getRefModuleFullyQualifiedName();
}
else if(areEqual(expectedName, NOT_FOUND_SpecialMarker)) {
expectedName = NotFoundErrorElement.NOT_FOUND__Name;
}
return testResolveElement(refElement, expectedName);
}
protected static ReferenceResult testResolveElement(PickedElement<? extends IReference> refElement,
String expectedName) {
IReference ref = refElement.element;
ISemanticContext context = refElement.context;
//refElement.internal_resetSemanticResolutions();
// Test caching
ReferenceSemantics semantics = ref.getSemantics(context);
ReferenceResult resolveTargetElement = semantics.resolveTargetElement();
assertTrue(semantics == ref.getSemantics(context));
assertTrue(resolveTargetElement == semantics.resolveTargetElement());
INamedElement result = resolveTargetElement.result;
assertTrue(result != null && areEqual(result.getName(), expectedName));
return resolveTargetElement;
}
@Test
public void testResolveRef() throws Exception { testResolveRef$(); }
public void testResolveRef$() throws Exception {
testResolveElement(parseElement("int/*M*/ ref_int;", RefPrimitive.class));
testResolveElement(parseElement("class target { }; target/*M*/ bar;", RefIdentifier.class));
testResolveElement(parseElement("not_found/*M*/ foo;", RefIdentifier.class),
NotFoundErrorElement.NOT_FOUND__Name);
testResolveElement(new PickedElement<IReference>(
new ModuleQualifiedReference("object", "TypeInfo_Class"),
new MissingStandardLibraryResolution(defaultSemMgr)), "TypeInfo_Class");
testResolveElement(parseElement("import target;", "target", RefModule.class));
/* TODO: test rest of reference classes */
// StandardLibraryResolution stdLibBR = defaultSemMgr.getUpdatedStdLibResolution(DEFAULT_DMD_INSTALL_EXE_PATH);
// INamedElement intElement = parseSourceAndFindNode("int ref_int;", 0, RefPrimitive.class).
// resolveTargetElement(stdLibBR).getSingleResult();
// INamedElement singleResult = intElement;
}
}