/******************************************************************************* * Copyright (c) 2012-2015 Codenvy, S.A. * 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: * Codenvy, S.A. - initial API and implementation *******************************************************************************/ package org.eclipse.che.ide.ext.java; import org.eclipse.che.jdt.BinaryTypeConvector; import org.eclipse.che.jdt.BindingASTVisitor; import org.eclipse.che.jdt.JsonSearchRequester; import org.eclipse.che.jdt.TypeBindingConvector; import org.eclipse.che.jdt.internal.core.SourceTypeElementInfo; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.IType; import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jdt.core.dom.CodenvyCompilationUnitResolver; import org.eclipse.jdt.core.dom.CompilationUnit; import org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration; import org.eclipse.jdt.internal.compiler.env.IBinaryType; import org.eclipse.jdt.internal.compiler.env.ICompilationUnit; import org.eclipse.jdt.internal.compiler.env.INameEnvironment; import org.eclipse.jdt.internal.compiler.env.ISourceType; import org.eclipse.jdt.internal.compiler.env.NameEnvironmentAnswer; import org.eclipse.jdt.internal.compiler.lookup.SourceTypeBinding; import org.eclipse.jdt.internal.compiler.lookup.TypeBinding; import org.fest.assertions.Assertions; import org.junit.Test; import java.util.HashMap; import java.util.Map; /** * @author Evgen Vidolob */ public class SearchableEnvironmentTest extends BaseTest{ @Test public void testAccessRule() throws Exception { JsonSearchRequester storage = new JsonSearchRequester(); project.getNameEnvironment().findTypes("st".toCharArray(), true, true, 0, storage); Assertions.assertThat(storage.toJsonString()).doesNotContain("com.sun.xml.internal.stream.buffer.stax.StreamWriterBufferProcessor") .doesNotContain("sun.font.StandardGlyphVector") .doesNotContain("sun.nio.cs.StreamDecoder "); } @Test public void testSourceAnnotation() throws Exception { NameEnvironmentAnswer answer = project.getNameEnvironment().findType("GenerateLink".toCharArray(), new char[][]{"com".toCharArray(), "codenvy".toCharArray(), "test".toCharArray()}); String type = processAnswer(answer, project, project.getNameEnvironment()); Assertions.assertThat(type).contains("\"tagBits\":\"53118008391424\""); } private String processAnswer(NameEnvironmentAnswer answer, IJavaProject project, INameEnvironment environment) throws JavaModelException { if (answer == null) return null; if (answer.isBinaryType()) { IBinaryType binaryType = answer.getBinaryType(); return BinaryTypeConvector.toJsonBinaryType(binaryType); } else if (answer.isCompilationUnit()) { ICompilationUnit compilationUnit = answer.getCompilationUnit(); return getSourceTypeInfo(project, environment, compilationUnit); } else if (answer.isSourceType()) { ISourceType[] sourceTypes = answer.getSourceTypes(); if (sourceTypes.length == 1) { ISourceType sourceType = sourceTypes[0]; SourceTypeElementInfo elementInfo = (SourceTypeElementInfo)sourceType; IType handle = elementInfo.getHandle(); org.eclipse.jdt.core.ICompilationUnit unit = handle.getCompilationUnit(); return getSourceTypeInfo(project, environment, (ICompilationUnit)unit); } } return null; } private String getSourceTypeInfo(IJavaProject project, INameEnvironment environment, ICompilationUnit compilationUnit) throws JavaModelException { CompilationUnit result = getCompilationUnit(project, environment, compilationUnit); BindingASTVisitor visitor = new BindingASTVisitor(); result.accept(visitor); Map<TypeBinding, ?> bindings = (Map<TypeBinding, ?>)result.getProperty("compilerBindingsToASTBindings"); SourceTypeBinding binding = null; for (Map.Entry<TypeBinding, ?> entry : bindings.entrySet()) { if (entry.getValue().equals(visitor.getTypeBinding())) { binding = (SourceTypeBinding)entry.getKey(); break; } } if (binding == null) return null; return TypeBindingConvector.toJsonBinaryType(binding); } private CompilationUnit getCompilationUnit(IJavaProject project, INameEnvironment environment, ICompilationUnit compilationUnit) throws JavaModelException { int flags = 0; flags |= org.eclipse.jdt.core.ICompilationUnit.ENABLE_STATEMENTS_RECOVERY; flags |= org.eclipse.jdt.core.ICompilationUnit.IGNORE_METHOD_BODIES; flags |= org.eclipse.jdt.core.ICompilationUnit.ENABLE_BINDINGS_RECOVERY; HashMap<String, String> opts = new HashMap<>(options); CompilationUnitDeclaration compilationUnitDeclaration = CodenvyCompilationUnitResolver.resolve(compilationUnit, project, environment, opts, flags, null); return CodenvyCompilationUnitResolver.convert( compilationUnitDeclaration, compilationUnit.getContents(), flags, opts); } }