/*******************************************************************************
* 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.assertFail;
import static melnorme.utilbox.core.Assert.AssertNamespace.assertTrue;
import melnorme.lang.tooling.engine.OverloadedNamedElement;
import melnorme.lang.tooling.engine.PickedElement;
import melnorme.lang.tooling.symbols.INamedElement;
import melnorme.utilbox.collections.Collection2;
import java.util.function.Function;
import java.util.function.Predicate;
import melnorme.utilbox.misc.ArrayUtil;
import dtool.ast.definitions.EArcheType;
import dtool.ast.references.NamedReference;
import dtool.engine.ResolvedModule;
import dtool.engine.util.NamedElementUtil;
public abstract class CommonLookupTest extends CommonNodeSemanticsTest {
protected static ResolvedModule parseModule_WithRef(String source, String refName) {
return parseModule_(source + mref(refName));
}
protected static String mref(String refName) {
return " auto _ = " + refName + "/*M*/";
}
protected static void testLookup(ResolvedModule resolvedModule, Predicate<INamedElement> checker) {
testLookup(resolvedModule, "/*M*/", checker);
}
protected static void testLookup(ResolvedModule resolvedModule, String offsetMarker,
Predicate<INamedElement> checker) {
testLookup_______(resolvedModule, offsetMarker, checker);
}
private static void testLookup_______(ResolvedModule resolvedModule, String offsetMarker,
Predicate<INamedElement> checker) {
resolvedModule.getSemanticContext()._resetSemantics();
INamedElement matchedElement = getReferenceResolvedElement(resolvedModule, offsetMarker);
checker.test(matchedElement);
}
public static INamedElement getReferenceResolvedElement(ResolvedModule resolvedModule, String offsetMarker) {
PickedElement<NamedReference> pick = pickElement(resolvedModule, offsetMarker, NamedReference.class);
return pick.element.getSemantics(pick.context).resolveTargetElement_();
}
/* ----------------- ----------------- */
protected static Object[] elementToStringArray(Collection2<INamedElement> overloadedElements) {
Object[] results = ArrayUtil.map(overloadedElements, new Function<INamedElement, String>() {
@Override
public String apply(INamedElement namedElement) {
return NamedElementUtil.namedElementToString(namedElement);
}
});
return results;
}
protected static Predicate<INamedElement> checkNameConflict(final String... expectedResults) {
return new Predicate<INamedElement>() {
@Override
public boolean test(INamedElement matchedElement) {
OverloadedNamedElement overload = assertInstance(matchedElement, OverloadedNamedElement.class);
assertEqualSet(
hashSet(elementToStringArray(overload.getOverloadedElements())),
hashSet(expectedResults)
);
boolean isError = true;
if(isError) {
assertTrue(overload.getArcheType() == EArcheType.Error);
} else {
assertFail(); // TODO
}
return true;
}
};
}
}