/*******************************************************************************
* 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 java.io.IOException;
import melnorme.lang.tooling.context.EmptySemanticResolution;
import melnorme.lang.tooling.context.ISemanticContext;
import melnorme.lang.tooling.context.ModuleFullName;
import melnorme.lang.tooling.context.ModuleSourceException;
import melnorme.lang.tooling.engine.ErrorElement;
import melnorme.lang.tooling.engine.ErrorElement.NotFoundErrorElement;
import melnorme.lang.tooling.engine.PickedElement;
import melnorme.lang.tooling.symbols.IConcreteNamedElement;
import melnorme.lang.tooling.symbols.INamedElement;
import org.junit.Test;
import dtool.ast.references.NamedReference;
import dtool.ast.references.RefIdentifier;
import dtool.engine.ResolvedModule;
public class NameLookup_ErrorsTest extends CommonNodeSemanticsTest {
protected IConcreteNamedElement doResolveConcreteElement(String source, String marker) {
PickedElement<INamedElement> pickedElement = parseElement(source, marker, INamedElement.class);
ISemanticContext context = pickedElement.context;
return pickedElement.element.resolveConcreteElement(context);
}
protected IConcreteNamedElement doResolveConcreteElementForRef(String source, String marker) {
PickedElement<NamedReference> pickedElement = parseElement(source, marker, NamedReference.class);
ISemanticContext context = pickedElement.context;
return pickedElement.element.resolveTargetElement(context).resolveConcreteElement(context);
}
protected INamedElement doResolveNamedElementForRef(String source, String marker) {
PickedElement<RefIdentifier> pickedElement = parseElement(source, marker, RefIdentifier.class);
ISemanticContext context = pickedElement.context;
return pickedElement.element.resolveTargetElement(context);
}
@Test
public void testNotFound() throws Exception { testNotFound_____(); }
public void testNotFound_____() throws Exception {
checkResultNotFound(
doResolveNamedElementForRef("int blah = xxx;", "xxx"));
checkResultNotFound(
doResolveNamedElementForRef("alias A = xxx;", "xxx"));
checkResultNotFound(
doResolveConcreteElementForRef("alias A = B; alias B = xxx; alias _ = A/**/;", "A/**/;"));
checkResultNotFound(
doResolveConcreteElementForRef("import not_found; alias _ = not_found/**/;", "not_found/**/;"));
testModuleParseException();
}
protected void checkResultNotFound(INamedElement result) {
assertTrue(result.getName().equals(NotFoundErrorElement.NOT_FOUND__Name));
assertTrue(result.getNameInRegularNamespace() == null);
assertTrue(result.getModuleFullName() == null);
}
protected void testModuleParseException() {
NamedReference element = parseElement("import not__found;", "not__found;", NamedReference.class).element;
ISemanticContext context = new EmptySemanticResolution() {
@Override
protected ResolvedModule getBundleResolvedModule(ModuleFullName moduleFullName)
throws ModuleSourceException {
throw new ModuleSourceException(new IOException("FAKE_IO_ERROR"));
}
};
IConcreteNamedElement resolvedElement = element.resolveTargetElement(context).resolveConcreteElement(context);
assertTrue(resolvedElement.getName().equals("not__found"));
assertTrue(resolvedElement.getNameInRegularNamespace() == null);
assertTrue(resolvedElement instanceof ErrorElement);
}
/* ----------------- ----------------- */
@Test
public void testLoop() throws Exception { testLoop_____(); }
public void testLoop_____() throws Exception {
checkLoopResult(
doResolveConcreteElementForRef("alias A= B; alias B = A/**/;", "A/**/"));
checkLoopResult(
doResolveConcreteElementForRef("alias A= B; alias B = C; alias C = A/**/;", "A/**/"));
checkLoopResult(
doResolveConcreteElement("alias A= B; alias B = C; alias C = A/**/;", "C = A"));
checkResultNotFound(
doResolveConcreteElementForRef("B A; A B; auto _ = A.xxx;", "xxx"));
checkResultNotFound(
doResolveConcreteElementForRef("alias A= B; alias B = A; auto _ = A.xxx;", "xxx"));
checkResultNotFound(
doResolveConcreteElementForRef("class A : A { }; auto _ = A.xxx;", "xxx"));
checkResultNotFound(
doResolveConcreteElementForRef("class A : B { }; class B : A { }; auto _ = A.xxx;", "xxx"));
checkResultNotFound(
doResolveConcreteElementForRef("class A : A; auto _ = A.xxx;", "xxx"));
}
protected void checkLoopResult(INamedElement result) {
assertTrue(result.getName().equals(ErrorElement.LOOP_ERROR_ELEMENT__Name));
assertTrue(result.getNameInRegularNamespace() == null);
}
}