/* * <copyright> * * Copyright (c) 2005, 2009 Sven Efftinge and others. * 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: * Sven Efftinge - Initial API and implementation * Alexander Shatalin (Borland) - Initial API and implementation * * </copyright> */ package org.eclipse.gmf.tests.xtend; import java.util.HashSet; import java.util.Iterator; import java.util.Set; import org.eclipse.emf.ecore.EClassifier; import org.eclipse.emf.ecore.EcorePackage; import org.eclipse.gmf.internal.xpand.BuiltinMetaModel; import org.eclipse.gmf.internal.xpand.expression.AnalysationIssue; import org.eclipse.gmf.internal.xpand.expression.ExecutionContext; import org.eclipse.gmf.internal.xpand.expression.ExecutionContextImpl; import org.eclipse.gmf.internal.xpand.util.ClassLoadContext; import org.eclipse.gmf.internal.xpand.xtend.ast.ExpressionExtensionStatement; import org.eclipse.gmf.internal.xpand.xtend.ast.Extension; import org.eclipse.gmf.internal.xpand.xtend.ast.ExtensionFile; import org.eclipse.gmf.tests.expression.ast.ATypeModel; public class ExtensionAnalyzationTest extends AbstractXtendTest { private Set<AnalysationIssue> issues; private ExecutionContextImpl ec; @Override protected void setUp() throws Exception { ec = new ExecutionContextImpl(null); ec.setContextClassLoader(new ClassLoadContext.Naive(this.getClass().getClassLoader())); issues = new HashSet<AnalysationIssue>(); } private void dumpIssues() { for (final Iterator<AnalysationIssue> iter = issues.iterator(); iter.hasNext();) { final AnalysationIssue element = iter.next(); System.out.println(element.getType().toString() + " - " + element.getMessage()); } } public void testNonStaticJavaExtension() { final ExtensionFile file = parse("String nonStaticHelper(String str) :JAVA " + Helper.class.getName() + ".nonStaticHelper(java.lang.String) ; \n"); file.analyze(ec, issues); dumpIssues(); assertEquals(1, issues.size()); assertEquals(AnalysationIssue.Type.FEATURE_NOT_FOUND, issues.iterator().next().getType()); } public void testNonStaticJavaExtensionWithSlot() { final ExtensionFile file = parse("String nonStaticHelperWithSlot(String str) :JAVA [instanceSlot]" + Helper.class.getName() + ".nonStaticHelper(java.lang.String) ; \n"); file.analyze(ec, issues); dumpIssues(); assertEquals(0, issues.size()); } public void testStaticJavaExtension() { final ExtensionFile file = parse("String toUpperCase(String str) : JAVA " + Helper.class.getName() + ".toUpperCase(java.lang.String) ; \n"); file.analyze(ec, issues); dumpIssues(); assertEquals(0, issues.size()); } public void testNonExistentJavaMethod() { final ExtensionFile file = parse("String nonExistentMethod(String str) :JAVA " + Helper.class.getName() + ".nonExistentMethod(java.lang.String) ; \n"); file.analyze(ec, issues); dumpIssues(); assertEquals(1, issues.size()); assertEquals(AnalysationIssue.Type.FEATURE_NOT_FOUND, issues.iterator().next().getType()); } public final void testExpressionExtension() { final ExtensionFile file = parse("String plainExtension() : 'zzz' ;\n" + "/* \n" + " * Meine Funktion \n" + " */ \n" + "myExtension(Object val) : {val}; \n"); file.analyze(ec, issues); dumpIssues(); assertEquals(0, issues.size()); final ExpressionExtensionStatement ext = (ExpressionExtensionStatement) file.getExtensions().get(1); assertEquals(BuiltinMetaModel.getListType(EcorePackage.eINSTANCE.getEBoolean()), ext.getReturnType(new EClassifier[] { EcorePackage.eINSTANCE.getEBoolean() }, ec, new HashSet<AnalysationIssue>())); assertEquals(BuiltinMetaModel.getListType(EcorePackage.eINSTANCE.getEString()), ext.getReturnType(new EClassifier[] { EcorePackage.eINSTANCE.getEString() }, ec, new HashSet<AnalysationIssue>())); assertEquals(BuiltinMetaModel.getListType(EcorePackage.eINSTANCE.getEJavaObject()), ext.getReturnType(new EClassifier[] { EcorePackage.eINSTANCE.getEJavaObject() }, ec, new HashSet<AnalysationIssue>())); } public final void testRecursionWithoutType() { final ExtensionFile file = parse("recExtension(Integer i) : i==0 ? {i} : recExtension(i-1).add(i) ; \n"); ec = (ExecutionContextImpl) ec.cloneWithResource(file); final ExpressionExtensionStatement ext = (ExpressionExtensionStatement) file.getExtensions().get(0); final EClassifier result = ext.getReturnType(new EClassifier[] { EcorePackage.eINSTANCE.getEInt() }, ec, new HashSet<AnalysationIssue>()); assertNull(result); } public final void testRecursionWithType() { final ExtensionFile file = parse("List[Integer] recExtension(Integer i) : i==0 ? {i} : recExtension(i-1).add(i) ; \n"); ec = (ExecutionContextImpl) ec.cloneWithResource(file); final ExpressionExtensionStatement ext = (ExpressionExtensionStatement) file.getExtensions().get(0); final EClassifier result = ext.getReturnType(new EClassifier[] { EcorePackage.eINSTANCE.getEInt() }, ec, new HashSet<AnalysationIssue>()); assertEquals(0, issues.size()); assertEquals(BuiltinMetaModel.getListType(EcorePackage.eINSTANCE.getEInt()), result); } public final void testMemberPosition() { final ExtensionFile file = parse("ext1(String txt) : 'test'+txt ;" + "ext2(String txt) : txt.ext1() ;"); ec = (ExecutionContextImpl) ec.cloneWithResource(file); final Extension ext = ec.getExtension("ext2", new EClassifier[] { EcorePackage.eINSTANCE.getEString() }); final EClassifier evalResult = ext.getReturnType(new EClassifier[] { EcorePackage.eINSTANCE.getEString() }, ec, new HashSet<AnalysationIssue>()); assertEquals(EcorePackage.eINSTANCE.getEString(), evalResult); } public final void testDuplicateParameterNames1() { final ExtensionFile file = parse("ext1(String txt, String txt) : 'test'+txt ;"); ec = (ExecutionContextImpl) ec.cloneWithResource(file); file.analyze(ec, issues); assertEquals(1, issues.size()); } public final void testDuplicateParameterNames2() { final ExtensionFile file = parse("ext1(String txt, String txt2) : 'test'+txt ;"); ec = (ExecutionContextImpl) ec.cloneWithResource(file); file.analyze(ec, issues); assertEquals(0, issues.size()); } public final void testThisParameterName() { final ExtensionFile file = parse("ext1(String this, String txt2) : 'test'+length() ;"); ec = (ExecutionContextImpl) ec.cloneWithResource(file); file.analyze(ec, issues); assertEquals(0, issues.size()); } public final void testCreateExtension() { final ExtensionFile file = parse("create List[String] l test(String s) : l.add(s) ;"); ec = (ExecutionContextImpl) ec.cloneWithResource(file); file.analyze(ec, issues); assertEquals(0, issues.size()); final Extension ext = file.getExtensions().get(0); assertEquals("List", ext.getReturnType(null, ec, null).eClass().getName()); } public final void testCreateExtension1() { final ExtensionFile file = parse("create List[String] test(String s) : add(s) ;"); ec = (ExecutionContextImpl) ec.cloneWithResource(file); file.analyze(ec, issues); assertEquals(0, issues.size()); final Extension ext = file.getExtensions().get(0); assertEquals("List", ext.getReturnType(null, ec, null).eClass().getName()); } public final void testAmbigous() { ATypeModel aType = new ATypeModel(); final ExtensionFile file = parse("import '" + aType.getMetaType().getEPackage().getName() + "';" + "doStuff(" + aType.getMetaType().getName() + " this) : true; " + "doStuff(" + aType.getMetaTypeC().getName() + " this) : false;" + "bla(" + aType.getMetaTypeB().getName() + " this) : this.doStuff();"); ExecutionContext ctx = aType.newContext(file); // XXX can't use file.analyze unless metamodel registration works // ExtensionFile.analyze clones context and getAllVisibleMetamodel // override goes away for (Extension x : file.getExtensions()) { x.analyze(ctx, issues); } System.out.println(issues); assertEquals(1, issues.size()); } }