/*******************************************************************************
 * Copyright (c) 2000, 2012 IBM Corporation and others.
 *
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.jdt.core.tests.model;

import junit.framework.Test;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.content.IContentType;
import org.eclipse.jdt.core.IClasspathEntry;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IPackageFragment;
import org.eclipse.jdt.core.IPackageFragmentRoot;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.core.dom.AST;
import org.eclipse.jdt.core.dom.ASTParser;
import org.eclipse.jdt.internal.core.SourceType;

/**
 * Test retrieving types by their name.
 */
public class ClassNameTests extends ModifyingResourceTests {

	static IJavaProject TEST_PROJECT;
	final static int SF_LENGTH = 5;
	static int TESTS_COUNT;

public ClassNameTests(String name) {
	super(name);
}

static {
//	org.eclipse.jdt.internal.core.NameLookup.VERBOSE = true;
//	TESTS_NAMES = new String[] { "testFindSecondaryType_Bug72179" };
//	TESTS_PREFIX = "testReconcile";
}
public static Test suite() {
	Test suite = buildModelTestSuite(ClassNameTests.class);
	TESTS_COUNT = suite.countTestCases();
	return suite;
}

/**
 * Internal synonym for deprecated constant AST.JSL3
 * to alleviate deprecation warnings.
 * @deprecated
 */
/*package*/ static final int JLS3_INTERNAL = AST.JLS3;

/* (non-Javadoc)
 * @see org.eclipse.jdt.core.tests.model.AbstractJavaModelTests#setUp()
 */
@Override
protected void setUp() throws Exception {
	super.setUp();
	if (TEST_PROJECT == null) {
		String[] sourceFolders = new String[SF_LENGTH];
		for (int i=0; i<SF_LENGTH; i++) {
			sourceFolders[i] = "src" + i;
		}
		TEST_PROJECT = createJavaProject("TestProject", sourceFolders, new String[] {"JCL_LIB"}, "bin");
		createFolder("/TestProject/src0/org/eclipse/jdt/core/test0");
		createFile(
			"/TestProject/src0/org/eclipse/jdt/core/test0/Foo.java",
			"package org.eclipse.jdt.core.test0;\n" +
			"public class Foo {\n" +
			"	class InFoo {}\n" +
			"}\n" +
			"class Secondary {\n" +
			"	class InSecondary {}\n" +
			"}\n"
		);
		createFile(
			"/TestProject/src1/Foo.java",
			"public class Foo {\n" +
			"	class InFoo {}\n" +
			"}\n" +
			"class Secondary {\n" +
			"	class InSecondary {}\n" +
			"}\n"
		);
		int length = SF_LENGTH - 1;
		createFolder("/TestProject/src"+length+"/org/eclipse/jdt/core/test"+length);
		createFile(
			"/TestProject/src"+length+"/org/eclipse/jdt/core/test"+length+"/Foo.java",
			"package org.eclipse.jdt.core.test"+length+";\n" +
			"public class Foo {\n" +
			"}\n" +
			"class Secondary {\n" +
			"}\n"
		);
		createFile(
			"/TestProject/src"+length+"/org/eclipse/jdt/core/test"+length+"/Test.java",
			"package org.eclipse.jdt.core.test"+length+";\n" +
			"public class Test {\n" +
			"	public static void main(String[] args) {\n" +
			"		Secondary s = new Secondary();\n" +
			"	}\n" +
			"}\n"
		);
	}
}

/* (non-Javadoc)
 * @see org.eclipse.jdt.core.tests.model.AbstractJavaModelTests#tearDown()
 */
@Override
protected void tearDown() throws Exception {
	TESTS_COUNT--;
	if (TEST_PROJECT != null && TESTS_COUNT == 0) {
		deleteResource(TEST_PROJECT.getProject());
	}
	super.tearDown();
}

protected void assertTypeFound(String typeName, String expectedResult) throws JavaModelException {
	assertNotNull("TEST_PROJECT should not be null!!!", TEST_PROJECT);
	IType type = TEST_PROJECT.findType(typeName, new NullProgressMonitor());
	assertTrue("type "+typeName+" should exist!", type != null && type.exists());
	assertEquals("Expected type "+typeName+" NOT found!",
		expectedResult,
		((SourceType)type).toStringWithAncestors()
	);
}
protected void assertTypeFound(String packageName, String typeName, String expectedResult) throws JavaModelException {
	assertNotNull("TEST_PROJECT should not be null!!!", TEST_PROJECT);
	IType type = TEST_PROJECT.findType(packageName, typeName, new NullProgressMonitor());
	assertTrue("type "+typeName+" should exist!", type != null && type.exists());
	assertEquals("Expected type "+typeName+" NOT found!",
		expectedResult,
		((SourceType)type).toStringWithAncestors()
	);
}

protected void assertTypeNotFound(String typeName) throws JavaModelException {
	assertNotNull("TEST_PROJECT should not be null!!!", TEST_PROJECT);
	IType type = TEST_PROJECT.findType(typeName, new NullProgressMonitor());
	assertNotNull("type "+typeName+" should NOT be null!", type);
	assertFalse("type "+typeName+" should NOT exist!", type.exists());
}
protected void assertTypeNotFound(String packageName, String typeName) throws JavaModelException {
	assertNotNull("TEST_PROJECT should not be null!!!", TEST_PROJECT);
	IType type = TEST_PROJECT.findType(packageName, typeName, new NullProgressMonitor());
	assertNotNull("type "+typeName+" should NOT be null!", type);
	assertFalse("type "+typeName+" should NOT exist!", type.exists());
}

protected void assertTypeUnknown(String typeName) throws JavaModelException {
	assertNotNull("TEST_PROJECT should not be null!!!", TEST_PROJECT);
	IType type = TEST_PROJECT.findType(typeName, new NullProgressMonitor());
	assertNull("type "+typeName+" should NOT be found!", type);
}
protected void assertTypeUnknown(String packageName, String typeName) throws JavaModelException {
	assertNotNull("TEST_PROJECT should not be null!!!", TEST_PROJECT);
	IType type = TEST_PROJECT.findType(packageName, typeName, new NullProgressMonitor());
	assertNull("type "+typeName+" should NOT be found!", type);
}

/**
 * Tests that a type in a jar with a name ending with $ can be retrieved.
 */
public void testClassNameWithDollar() throws JavaModelException, CoreException {
	try {
		byte[] tab = new byte[372];
		tab[0]=80;
		tab[1]=75;
		tab[2]=3;
		tab[3]=4;
		tab[4]=20;
		tab[5]=0;
		tab[6]=8;
		tab[7]=0;
		tab[8]=8;
		tab[9]=0;
		tab[10]=-63;
		tab[11]=88;
		tab[12]=-102;
		tab[13]=44;
		tab[14]=0;
		tab[15]=0;
		tab[16]=0;
		tab[17]=0;
		tab[18]=0;
		tab[19]=0;
		tab[20]=0;
		tab[21]=0;
		tab[22]=0;
		tab[23]=0;
		tab[24]=0;
		tab[25]=0;
		tab[26]=11;
		tab[27]=0;
		tab[28]=0;
		tab[29]=0;
		tab[30]=112;
		tab[31]=49;
		tab[32]=47;
		tab[33]=65;
		tab[34]=36;
		tab[35]=46;
		tab[36]=99;
		tab[37]=108;
		tab[38]=97;
		tab[39]=115;
		tab[40]=115;
		tab[41]=93;
		tab[42]=78;
		tab[43]=-63;
		tab[44]=74;
		tab[45]=-61;
		tab[46]=64;
		tab[47]=16;
		tab[48]=125;
		tab[49]=-45;
		tab[50]=77;
		tab[51]=-78;
		tab[52]=53;
		tab[53]=86;
		tab[54]=91;
		tab[55]=99;
		tab[56]=127;
		tab[57]=64;
		tab[58]=-24;
		tab[59]=-95;
		tab[60]=21;
		tab[61]=106;
		tab[62]=-16;
		tab[63]=-84;
		tab[64]=8;
		tab[65]=-91;
		tab[66]=-48;
		tab[67]=83;
		tab[68]=48;
		tab[69]=-121;
		tab[70]=74;
		tab[71]=-17;
		tab[72]=-101;
		tab[73]=-72;
		tab[74]=-42;
		tab[75]=45;
		tab[76]=49;
		tab[77]=43;
		tab[78]=49;
		tab[79]=-11;
		tab[80]=-69;
		tab[81]=-12;
		tab[82]=84;
		tab[83]=-16;
		tab[84]=-32;
		tab[85]=7;
		tab[86]=-8;
		tab[87]=81;
		tab[88]=-30;
		tab[89]=108;
		tab[90]=12;
		tab[91]=42;
		tab[92]=-50;
		tab[93]=-31;
		tab[94]=61;
		tab[95]=102;
		tab[96]=-26;
		tab[97]=-67;
		tab[98]=121;
		tab[99]=-13;
		tab[100]=-15;
		tab[101]=-7;
		tab[102]=-10;
		tab[103]=14;
		tab[104]=-127;
		tab[105]=41;
		tab[106]=-122;
		tab[107]=4;
		tab[108]=-1;
		tab[109]=-15;
		tab[110]=60;
		tab[111]=-98;
		tab[112]=-115;
		tab[113]=36;
		tab[114]=-120;
		tab[115]=48;
		tab[116]=-40;
		tab[117]=-88;
		tab[118]=103;
		tab[119]=21;
		tab[120]=23;
		tab[121]=-86;
		tab[122]=92;
		tab[123]=-57;
		tab[124]=105;
		tab[125]=-74;
		tab[126]=-47;
		tab[127]=121;
		tab[128]=45;
		tab[129]=33;
		tab[130]=8;
		tab[131]=-63;
		tab[132]=-91;
		tab[133]=41;
		tab[134]=77;
		tab[135]=125;
		tab[136]=69;
		tab[137]=16;
		tab[138]=-29;
		tab[139]=-55;
		tab[140]=-118;
		tab[141]=-32;
		tab[142]=-51;
		tab[143]=-19;
		tab[144]=-83;
		tab[145]=-18;
		tab[146]=-63;
		tab[147]=71;
		tab[148]=16;
		tab[149]=-62;
		tab[150]=67;
		tab[151]=-105;
		tab[152]=-48;
		tab[153]=79;
		tab[154]=76;
		tab[155]=-87;
		tab[156]=-81;
		tab[157]=-73;
		tab[158]=15;
		tab[159]=-103;
		tab[160]=-82;
		tab[161]=110;
		tab[162]=84;
		tab[163]=86;
		tab[164]=104;
		tab[165]=66;
		tab[166]=-108;
		tab[167]=-40;
		tab[168]=92;
		tab[169]=21;
		tab[170]=43;
		tab[171]=85;
		tab[172]=25;
		tab[173]=-41;
		tab[174]=-73;
		tab[175]=67;
		tab[176]=-81;
		tab[177]=-66;
		tab[178]=55;
		tab[179]=79;
		tab[180]=4;
		tab[181]=-103;
		tab[182]=52;
		tab[183]=121;
		tab[184]=23;
		tab[185]=124;
		tab[186]=-18;
		tab[187]=-50;
		tab[188]=90;
		tab[189]=-62;
		tab[190]=112;
		tab[191]=60;
		tab[192]=73;
		tab[193]=126;
		tab[194]=99;
		tab[195]=-105;
		tab[196]=117;
		tab[197]=101;
		tab[198]=-54;
		tab[199]=-75;
		tab[200]=91;
		tab[201]=46;
		tab[202]=-46;
		tab[203]=-76;
		tab[204]=-117;
		tab[205]=1;
		tab[206]=33;
		tab[207]=92;
		tab[208]=-38;
		tab[209]=109;
		tab[210]=-107;
		tab[211]=-21;
		tab[212]=-123;
		tab[213]=113;
		tab[214]=55;
		tab[215]=-28;
		tab[216]=108;
		tab[217]=116;
		tab[218]=-26;
		tab[219]=-60;
		tab[220]=56;
		tab[221]=65;
		tab[222]=-121;
		tab[223]=-61;
		tab[224]=93;
		tab[225]=117;
		tab[226]=64;
		tab[227]=-18;
		tab[228]=23;
		tab[229]=70;
		tab[230]=-55;
		tab[231]=93;
		tab[232]=-52;
		tab[233]=76;
		tab[234]=-52;
		tab[235]=-2;
		tab[236]=-23;
		tab[237]=14;
		tab[238]=123;
		tab[239]=-81;
		tab[240]=-51;
		tab[241]=58;
		tab[242]=100;
		tab[243]=12;
		tab[244]=-102;
		tab[245]=-95;
		tab[246]=-64;
		tab[247]=62;
		tab[248]=99;
		tab[249]=-17;
		tab[250]=91;
		tab[251]=-64;
		tab[252]=124;
		tab[253]=-64;
		tab[254]=76;
		tab[255]=56;
		tab[256]=68;
		tab[257]=-65;
		tab[258]=53;
		tab[259]=79;
		tab[260]=91;
		tab[261]=-77;
		tab[262]=-120;
		tab[263]=-114;
		tab[264]=94;
		tab[265]=-2;
		tab[266]=89;
		tab[267]=-125;
		tab[268]=63;
		tab[269]=86;
		tab[270]=-15;
		tab[271]=99;
		tab[272]=-115;
		tab[273]=26;
		tab[274]=-43;
		tab[275]=-15;
		tab[276]=23;
		tab[277]=80;
		tab[278]=75;
		tab[279]=7;
		tab[280]=8;
		tab[281]=122;
		tab[282]=-92;
		tab[283]=103;
		tab[284]=15;
		tab[285]=-20;
		tab[286]=0;
		tab[287]=0;
		tab[288]=0;
		tab[289]=78;
		tab[290]=1;
		tab[291]=0;
		tab[292]=0;
		tab[293]=80;
		tab[294]=75;
		tab[295]=1;
		tab[296]=2;
		tab[297]=20;
		tab[298]=0;
		tab[299]=20;
		tab[300]=0;
		tab[301]=8;
		tab[302]=0;
		tab[303]=8;
		tab[304]=0;
		tab[305]=-63;
		tab[306]=88;
		tab[307]=-102;
		tab[308]=44;
		tab[309]=122;
		tab[310]=-92;
		tab[311]=103;
		tab[312]=15;
		tab[313]=-20;
		tab[314]=0;
		tab[315]=0;
		tab[316]=0;
		tab[317]=78;
		tab[318]=1;
		tab[319]=0;
		tab[320]=0;
		tab[321]=11;
		tab[322]=0;
		tab[323]=0;
		tab[324]=0;
		tab[325]=0;
		tab[326]=0;
		tab[327]=0;
		tab[328]=0;
		tab[329]=0;
		tab[330]=0;
		tab[331]=0;
		tab[332]=0;
		tab[333]=0;
		tab[334]=0;
		tab[335]=0;
		tab[336]=0;
		tab[337]=0;
		tab[338]=0;
		tab[339]=112;
		tab[340]=49;
		tab[341]=47;
		tab[342]=65;
		tab[343]=36;
		tab[344]=46;
		tab[345]=99;
		tab[346]=108;
		tab[347]=97;
		tab[348]=115;
		tab[349]=115;
		tab[350]=80;
		tab[351]=75;
		tab[352]=5;
		tab[353]=6;
		tab[354]=0;
		tab[355]=0;
		tab[356]=0;
		tab[357]=0;
		tab[358]=1;
		tab[359]=0;
		tab[360]=1;
		tab[361]=0;
		tab[362]=57;
		tab[363]=0;
		tab[364]=0;
		tab[365]=0;
		tab[366]=37;
		tab[367]=1;
		tab[368]=0;
		tab[369]=0;
		tab[370]=0;
		tab[371]=0;
		IJavaProject javaProject = createJavaProject("P", new String[] {"src"}, "bin");
		IFile jarFile = createFile("P/lib.jar", tab);
		javaProject.setRawClasspath(new IClasspathEntry[] {JavaCore.newLibraryEntry(jarFile.getFullPath(), null, null, false)}, new NullProgressMonitor());
		javaProject.findType("p1.A$");
	} catch (CoreException e) {
		e.printStackTrace();
		assertTrue(false);
	} finally {
		deleteProject("P");
	}
}
/**
 * Tests that a member type can be retrived using a dot qualified name.
 */
public void testFindTypeWithDot() throws JavaModelException, CoreException {
	try {
		IJavaProject javaProject = createJavaProject("P", new String[] {""}, "");
		this.createFolder("/P/p");
		this.createFile(
			"/P/p/X.java",
			"package p;\n" +
			"public class X {\n" +
			"  public class Y {\n" +
			"  }\n" +
			"}"
		);
		IType type = javaProject.findType("p.X.Y");
		assertEquals(
			"Unexpected type found",
			"class Y [in X [in X.java [in p [in <project root> [in P]]]]]",
			type == null ? "null" : type.toString()
		);
	} finally {
		deleteProject("P");
	}
}

/**
 * Tests that a type in a jar with a name ending with $ can be retrieved.
 */
public void testSearchTypeNameInJars() throws JavaModelException, CoreException {
	try {
		byte[] tab = new byte[478];
		tab[0]=80;
		tab[1]=75;
		tab[2]=3;
		tab[3]=4;
		tab[4]=20;
		tab[5]=0;
		tab[6]=8;
		tab[7]=0;
		tab[8]=8;
		tab[9]=0;
		tab[10]=19;
		tab[11]=87;
		tab[12]=-95;
		tab[13]=44;
		tab[14]=0;
		tab[15]=0;
		tab[16]=0;
		tab[17]=0;
		tab[18]=0;
		tab[19]=0;
		tab[20]=0;
		tab[21]=0;
		tab[22]=0;
		tab[23]=0;
		tab[24]=0;
		tab[25]=0;
		tab[26]=9;
		tab[27]=0;
		tab[28]=0;
		tab[29]=0;
		tab[30]=112;
		tab[31]=49;
		tab[32]=47;
		tab[33]=112;
		tab[34]=50;
		tab[35]=47;
		tab[36]=112;
		tab[37]=51;
		tab[38]=47;
		tab[39]=3;
		tab[40]=0;
		tab[41]=80;
		tab[42]=75;
		tab[43]=7;
		tab[44]=8;
		tab[45]=0;
		tab[46]=0;
		tab[47]=0;
		tab[48]=0;
		tab[49]=2;
		tab[50]=0;
		tab[51]=0;
		tab[52]=0;
		tab[53]=0;
		tab[54]=0;
		tab[55]=0;
		tab[56]=0;
		tab[57]=80;
		tab[58]=75;
		tab[59]=3;
		tab[60]=4;
		tab[61]=20;
		tab[62]=0;
		tab[63]=8;
		tab[64]=0;
		tab[65]=8;
		tab[66]=0;
		tab[67]=19;
		tab[68]=87;
		tab[69]=-95;
		tab[70]=44;
		tab[71]=0;
		tab[72]=0;
		tab[73]=0;
		tab[74]=0;
		tab[75]=0;
		tab[76]=0;
		tab[77]=0;
		tab[78]=0;
		tab[79]=0;
		tab[80]=0;
		tab[81]=0;
		tab[82]=0;
		tab[83]=16;
		tab[84]=0;
		tab[85]=0;
		tab[86]=0;
		tab[87]=112;
		tab[88]=49;
		tab[89]=47;
		tab[90]=112;
		tab[91]=50;
		tab[92]=47;
		tab[93]=112;
		tab[94]=51;
		tab[95]=47;
		tab[96]=88;
		tab[97]=46;
		tab[98]=99;
		tab[99]=108;
		tab[100]=97;
		tab[101]=115;
		tab[102]=115;
		tab[103]=93;
		tab[104]=79;
		tab[105]=-53;
		tab[106]=78;
		tab[107]=-61;
		tab[108]=64;
		tab[109]=12;
		tab[110]=28;
		tab[111]=55;
		tab[112]=-81;
		tab[113]=-110;
		tab[114]=6;
		tab[115]=8;
		tab[116]=-3;
		tab[117]=3;
		tab[118]=110;
		tab[119]=60;
		tab[120]=-44;
		tab[121]=-82;
		tab[122]=10;
		tab[123]=71;
		tab[124]=16;
		tab[125]=23;
		tab[126]=36;
		tab[127]=78;
		tab[128]=81;
		tab[129]=57;
		tab[130]=20;
		tab[131]=69;
		tab[132]=-67;
		tab[133]=110;
		tab[134]=-62;
		tab[135]=-74;
		tab[136]=108;
		tab[137]=-107;
		tab[138]=102;
		tab[139]=-93;
		tab[140]=52;
		tab[141]=-27;
		tab[142]=-65;
		tab[143]=56;
		tab[144]=33;
		tab[145]=113;
		tab[146]=-32;
		tab[147]=3;
		tab[148]=-8;
		tab[149]=40;
		tab[150]=-124;
		tab[151]=55;
		tab[152]=-115;
		tab[153]=0;
		tab[154]=117;
		tab[155]=37;
		tab[156]=-49;
		tab[157]=-56;
		tab[158]=-10;
		tab[159]=-116;
		tab[160]=-19;
		tab[161]=-3;
		tab[162]=-6;
		tab[163]=-2;
		tab[164]=-8;
		tab[165]=-124;
		tab[166]=-125;
		tab[167]=17;
		tab[168]=78;
		tab[169]=8;
		tab[170]=97;
		tab[171]=53;
		tab[172]=17;
		tab[173]=-43;
		tab[174]=-107;
		tab[175]=-88;
		tab[176]=-82;
		tab[177]=-59;
		tab[178]=60;
		tab[179]=0;
		tab[180]=17;
		tab[181]=-30;
		tab[182]=-107;
		tab[183]=124;
		tab[184]=-107;
		tab[185]=-94;
		tab[186]=-112;
		tab[187]=-27;
		tab[188]=82;
		tab[189]=60;
		tab[190]=102;
		tab[191]=43;
		tab[192]=-107;
		tab[193]=55;
		tab[194]=1;
		tab[195]=28;
		tab[196]=-126;
		tab[197]=127;
		tab[198]=-85;
		tab[199]=75;
		tab[200]=-35;
		tab[201]=-36;
		tab[202]=17;
		tab[203]=-100;
		tab[204]=-77;
		tab[205]=-13;
		tab[206]=-108;
		tab[207]=-32;
		tab[208]=-34;
		tab[209]=-101;
		tab[210]=103;
		tab[211]=21;
		tab[212]=-63;
		tab[213]=-125;
		tab[214]=31;
		tab[215]=-62;
		tab[216]=69;
		tab[217]=-97;
		tab[218]=112;
		tab[219]=-100;
		tab[220]=-24;
		tab[221]=82;
		tab[222]=77;
		tab[223]=-73;
		tab[224]=-21;
		tab[225]=76;
		tab[226]=-43;
		tab[227]=79;
		tab[228]=50;
		tab[229]=43;
		tab[230]=20;
		tab[231]=97;
		tab[232]=-104;
		tab[233]=-104;
		tab[234]=92;
		tab[235]=22;
		tab[236]=-87;
		tab[237]=-84;
		tab[238]=-75;
		tab[239]=-51;
		tab[240]=-69;
		tab[241]=-94;
		tab[242]=-37;
		tab[243]=-68;
		tab[244]=-24;
		tab[245]=13;
		tab[246]=33;
		tab[247]=74;
		tab[248]=-2;
		tab[249]=-106;
		tab[250]=-34;
		tab[251]=-16;
		tab[252]=-52;
		tab[253]=-123;
		tab[254]=49;
		tab[255]=124;
		tab[256]=-56;
		tab[257]=-52;
		tab[258]=108;
		tab[259]=-21;
		tab[260]=92;
		tab[261]=61;
		tab[262]=104;
		tab[263]=43;
		tab[264]=-12;
		tab[265]=-25;
		tab[266]=99;
		tab[267]=123;
		tab[268]=7;
		tab[269]=78;
		tab[270]=-47;
		tab[271]=-29;
		tab[272]=5;
		tab[273]=-10;
		tab[274]=-11;
		tab[275]=64;
		tab[276]=118;
		tab[277]=31;
		tab[278]=99;
		tab[279]=-64;
		tab[280]=-103;
		tab[281]=96;
		tab[282]=38;
		tab[283]=102;
		tab[284]=-17;
		tab[285]=-30;
		tab[286]=29;
		tab[287]=7;
		tab[288]=111;
		tab[289]=109;
		tab[290]=59;
		tab[291]=100;
		tab[292]=-12;
		tab[293]=-37;
		tab[294]=-94;
		tab[295]=-125;
		tab[296]=1;
		tab[297]=99;
		tab[298]=-76;
		tab[299]=19;
		tab[300]=48;
		tab[301]=31;
		tab[302]=-74;
		tab[303]=3;
		tab[304]=-114;
		tab[305]=126;
		tab[306]=-51;
		tab[307]=-105;
		tab[308]=28;
		tab[309]=-74;
		tab[310]=71;
		tab[311]=-5;
		tab[312]=70;
		tab[313]=-9;
		tab[314]=-97;
		tab[315]=-111;
		tab[316]=58;
		tab[317]=35;
		tab[318]=-1;
		tab[319]=-83;
		tab[320]=85;
		tab[321]=-59;
		tab[322]=63;
		tab[323]=80;
		tab[324]=75;
		tab[325]=7;
		tab[326]=8;
		tab[327]=-99;
		tab[328]=105;
		tab[329]=77;
		tab[330]=-38;
		tab[331]=-36;
		tab[332]=0;
		tab[333]=0;
		tab[334]=0;
		tab[335]=53;
		tab[336]=1;
		tab[337]=0;
		tab[338]=0;
		tab[339]=80;
		tab[340]=75;
		tab[341]=1;
		tab[342]=2;
		tab[343]=20;
		tab[344]=0;
		tab[345]=20;
		tab[346]=0;
		tab[347]=8;
		tab[348]=0;
		tab[349]=8;
		tab[350]=0;
		tab[351]=19;
		tab[352]=87;
		tab[353]=-95;
		tab[354]=44;
		tab[355]=0;
		tab[356]=0;
		tab[357]=0;
		tab[358]=0;
		tab[359]=2;
		tab[360]=0;
		tab[361]=0;
		tab[362]=0;
		tab[363]=0;
		tab[364]=0;
		tab[365]=0;
		tab[366]=0;
		tab[367]=9;
		tab[368]=0;
		tab[369]=0;
		tab[370]=0;
		tab[371]=0;
		tab[372]=0;
		tab[373]=0;
		tab[374]=0;
		tab[375]=0;
		tab[376]=0;
		tab[377]=0;
		tab[378]=0;
		tab[379]=0;
		tab[380]=0;
		tab[381]=0;
		tab[382]=0;
		tab[383]=0;
		tab[384]=0;
		tab[385]=112;
		tab[386]=49;
		tab[387]=47;
		tab[388]=112;
		tab[389]=50;
		tab[390]=47;
		tab[391]=112;
		tab[392]=51;
		tab[393]=47;
		tab[394]=80;
		tab[395]=75;
		tab[396]=1;
		tab[397]=2;
		tab[398]=20;
		tab[399]=0;
		tab[400]=20;
		tab[401]=0;
		tab[402]=8;
		tab[403]=0;
		tab[404]=8;
		tab[405]=0;
		tab[406]=19;
		tab[407]=87;
		tab[408]=-95;
		tab[409]=44;
		tab[410]=-99;
		tab[411]=105;
		tab[412]=77;
		tab[413]=-38;
		tab[414]=-36;
		tab[415]=0;
		tab[416]=0;
		tab[417]=0;
		tab[418]=53;
		tab[419]=1;
		tab[420]=0;
		tab[421]=0;
		tab[422]=16;
		tab[423]=0;
		tab[424]=0;
		tab[425]=0;
		tab[426]=0;
		tab[427]=0;
		tab[428]=0;
		tab[429]=0;
		tab[430]=0;
		tab[431]=0;
		tab[432]=0;
		tab[433]=0;
		tab[434]=0;
		tab[435]=0;
		tab[436]=57;
		tab[437]=0;
		tab[438]=0;
		tab[439]=0;
		tab[440]=112;
		tab[441]=49;
		tab[442]=47;
		tab[443]=112;
		tab[444]=50;
		tab[445]=47;
		tab[446]=112;
		tab[447]=51;
		tab[448]=47;
		tab[449]=88;
		tab[450]=46;
		tab[451]=99;
		tab[452]=108;
		tab[453]=97;
		tab[454]=115;
		tab[455]=115;
		tab[456]=80;
		tab[457]=75;
		tab[458]=5;
		tab[459]=6;
		tab[460]=0;
		tab[461]=0;
		tab[462]=0;
		tab[463]=0;
		tab[464]=2;
		tab[465]=0;
		tab[466]=2;
		tab[467]=0;
		tab[468]=117;
		tab[469]=0;
		tab[470]=0;
		tab[471]=0;
		tab[472]=83;
		tab[473]=1;
		tab[474]=0;
		tab[475]=0;
		tab[476]=0;
		tab[477]=0;
		IJavaProject javaProject = createJavaProject("P1", new String[] {"src"}, "bin");
		IFile jarFile = createFile("P1/lib.jar", tab);
		javaProject.setRawClasspath(new IClasspathEntry[] {JavaCore.newLibraryEntry(jarFile.getFullPath(), null, null, false)}, new NullProgressMonitor());
		assertNotNull(javaProject.findType("p1.p2.p3.X"));
	} catch(JavaModelException e) {
		e.printStackTrace();
		assertTrue(false);
	} catch (CoreException e) {
		e.printStackTrace();
		assertTrue(false);
	} finally {
		deleteProject("P1");
	}
}

/**
 * Bug 36032: JavaProject.findType() fails to find second type in source file
 * @see "https://bugs.eclipse.org/bugs/show_bug.cgi?id=36032"
 */
public void testFindSecondaryType_Exist01() throws JavaModelException, CoreException {
	int length = SF_LENGTH - 1;
	assertTypeFound(
		"org.eclipse.jdt.core.test"+length+".Foo",
		"Foo [in Foo.java [in org.eclipse.jdt.core.test"+length+" [in src"+length+" [in TestProject]]]]"
	);
}
public void testFindSecondaryType_Exist02() throws JavaModelException, CoreException {
	int length = SF_LENGTH - 1;
	assertTypeFound(
		"org.eclipse.jdt.core.test"+length+".Secondary",
		"Secondary [in Foo.java [in org.eclipse.jdt.core.test"+length+" [in src"+length+" [in TestProject]]]]"
	);
}
public void testFindSecondaryType_Exist03() throws JavaModelException, CoreException {
	assertTypeFound(
		"org.eclipse.jdt.core.test0.Foo.InFoo",
		"InFoo [in Foo [in Foo.java [in org.eclipse.jdt.core.test0 [in src0 [in TestProject]]]]]"
	);
}
public void testFindSecondaryType_Exist04() throws JavaModelException, CoreException {
	assertTypeFound(
		"org.eclipse.jdt.core.test0.Secondary.InSecondary",
		"InSecondary [in Secondary [in Foo.java [in org.eclipse.jdt.core.test0 [in src0 [in TestProject]]]]]"
	);
}
public void testFindSecondaryType_Exist05() throws JavaModelException, CoreException {
	assertTypeFound(
		"Foo",
		"Foo [in Foo.java [in <default> [in src1 [in TestProject]]]]"
	);
}
public void testFindSecondaryType_Exist06() throws JavaModelException, CoreException {
	assertTypeFound(
		"Secondary",
		"Secondary [in Foo.java [in <default> [in src1 [in TestProject]]]]"
	);
}
// duplicate bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=72179
public void testFindSecondaryType_Bug72179() throws JavaModelException, CoreException {
	try {
		IJavaProject javaProject = createJavaProject("P", new String[] {""}, "");
		createFolder("/P/p1");
		createFile(
			"/P/p1/jc.java",
			"package p1;\n" +
			"class jc008{}\n" +
			"class jc009{}\n" +
			"class jc010 extends jc009 {\n" +
			"	jc008 a;\n" +
			"}\n"
		);
		IType type = javaProject.findType("p1", "jc008", new NullProgressMonitor());
		assertTrue("type 'jc008' should exist!", type != null && type.exists());
		assertEquals("Expected type 'jc008' NOT found!",
			"class jc008 [in jc.java [in p1 [in <project root> [in P]]]]",
			type.toString()
		);
		type = javaProject.findType("p1", "jc009", new NullProgressMonitor());
		assertTrue("type 'jc009' should exist!", type != null && type.exists());
		assertEquals("Expected type 'jc009' NOT found!",
			"class jc009 [in jc.java [in p1 [in <project root> [in P]]]]",
			type.toString()
		);
		type = javaProject.findType("p1", "jc010", new NullProgressMonitor());
		assertTrue("type 'jc010' should exist!", type != null && type.exists());
		assertEquals("Expected type 'jc010' NOT found!",
			"class jc010 [in jc.java [in p1 [in <project root> [in P]]]]\n" +
			"  jc008 a",
			type.toString()
		);
	} finally {
		deleteProject("P");
	}
}
public void testFindSecondaryType_NotFound01() throws JavaModelException, CoreException {
	assertTypeUnknown("test.Foo");
}
public void testFindSecondaryType_NotFound02() throws JavaModelException, CoreException {
	assertTypeUnknown("InFoo");
}
public void testFindSecondaryType_NotFound03() throws JavaModelException, CoreException {
	assertTypeUnknown("InSecondary");
}
public void testFindSecondaryType_NotFound04() throws JavaModelException, CoreException {
	assertTypeUnknown("Foo.inFoo");
}
public void testFindSecondaryType_NotFound05() throws JavaModelException, CoreException {
	assertTypeUnknown("Secondary.inBar");
}
public void testFindSecondaryType_Unknown01() throws JavaModelException, CoreException {
	assertTypeUnknown("Unknown");
}
public void testFindSecondaryType_Unknown02() throws JavaModelException, CoreException {
	assertTypeUnknown("Foo.Unknown");
}
public void testFindSecondaryType_Unknown03() throws JavaModelException, CoreException {
	assertTypeUnknown("org.eclipse.jdt.core.test.Unknown");
}

/**
 * @bug 152841: [model] IJavaProject.findType(name, monitor) doesn't find secondary type
 * @test Ensure that secondary type is found just after having created the compilation unit
 * @see "https://bugs.eclipse.org/bugs/show_bug.cgi?id=152841"
 */
public void testBug152841() throws Exception{
	try {
		IJavaProject project= createJavaProject("P", new String[] { "src" }, new String[] { "JCL_LIB" }, "bin");
		IPackageFragmentRoot root = (IPackageFragmentRoot) project.getChildren()[0];
		IPackageFragment pack= root.createPackageFragment("p", true, null);

		String source= "package p;\n" +
		"//use Object\n" +
		"class A {\n" +
		"	public void foo(){};\n" +
		"}";
		pack.createCompilationUnit("A.java", source, true, null);

		source= "package p;\n" +
		"\n" +
		"class Test{\n" +
		"	void test(){\n" +
		"		A a= new A();\n" +
		"		test(a);\n" +
		"	}\n" +
		"	void test(Object o){\n" +
		"		o.hashCode();\n" +
		"	}\n" +
		"}";
		ICompilationUnit cu= pack.createCompilationUnit("Test.java", source, true, null);

		ASTParser parser= ASTParser.newParser(JLS3_INTERNAL);
		parser.setSource(cu);
		parser.setResolveBindings(true);
		parser.createAST(null);

		source= "package p;\n" +
		"//use C\n" +
		"interface I{}\n" +
		"class C implements I{\n" +
		"}\n" +
		"class B extends C{\n" +
		"}\n" +
		"class A extends B{" +
		"}\n" +
		"class Test{\n" +
		"	void f(){\n" +
		"		A c= new A();\n" +
		"		c.toString();\n" +
		"	}\n" +
		"}";

		ICompilationUnit unit= pack.createCompilationUnit("I.java", source, true, null);
		IType type= project.findType("p.I", (IProgressMonitor) null);
		assertNotNull(type);

		// C exists
		assertTrue(unit.getType("C").exists());

		// but can't be found
		type= project.findType("p.C", (IProgressMonitor) null);
		assertNotNull(type);
	}
	finally {
		deleteProject("P");
	}
}

/**
 * @bug 302455: java.lang.ClassCastException in secondary types removal
 * @test Ensure that no invalid entries are put in the secondary types caches
 * 		when a file extension spec is removed from the workspace as the CCE
 * 		does no longer occur...
 * 		Also verify that secondary types from the removed file extension are not
 * 		kept in the projects caches as the secondary type is no longer in the
 * 		cache at the end of the test...
 * @see "https://bugs.eclipse.org/bugs/show_bug.cgi?id=302455"
 */
public void testBug302455() throws CoreException, InterruptedException {
	IContentType javaContentType = Platform.getContentTypeManager().getContentType(JavaCore.JAVA_SOURCE_CONTENT_TYPE);
	try {
		// Create project and file
		assertNotNull("We should have got a Java Source content type!", javaContentType);
		javaContentType.addFileSpec("b302455", IContentType.FILE_EXTENSION_SPEC);
		IJavaProject javaProject = createJavaProject("P");
		createFolder("/P/p");
		String filePath = "/P/p/Bug.b302455";
		createFile(
			filePath,
			"package p;\n" +
			"public class Bug {}\n" +
			"class Secondary {}\n" +
			""
		);
		waitUntilIndexesReady();

		// Get the secondary type
		IType type = javaProject.findType("p.Secondary", new NullProgressMonitor());
		assertNotNull("We should have found the secondary type!", type);

		// Remove file extension
		javaContentType.removeFileSpec("b302455", IContentType.FILE_EXTENSION_SPEC);

		// As there's no specific event fo
		type = javaProject.findType("p.Secondary", new NullProgressMonitor());
		assertNull("We should have not found the secondary type!", type);
	} finally {
		deleteProject("P");
	}
}

/**
 * @bug 306477: Indexer(?) fails to recognise enum as a type
 * @test Ensure that enum secondary type are well indexed
 * @see "https://bugs.eclipse.org/bugs/show_bug.cgi?id=306477"
 */
public void testBug306477() throws Exception {
	try {
		// create test case
		IJavaProject project = createJavaProject("P", new String[] {""}, new String[] {"JCL15_LIB"}, "", "1.5");
		createFolder("/P/p");
		createFile(
			"/P/p/Alice.java",
			"package p;\n" +
			"class Alice {\n" +
			"	Object j = Bob.CHARLIE;\n" +
			"}\n"
		);
		createFile(
			"/P/p/Misc.java",
			"package p;\n" +
			"enum Bob {\n" +
			"	CHARLIE;\n" +
			"}\n"
		);

		// find secondary enum
		IType type = project.findType("p.Bob", new NullProgressMonitor());
		assertElementEquals("We should have found the secondary enum 'Bob'!",
			"Bob [in Misc.java [in p [in <project root> [in P]]]]",
			type
		);
	} finally {
		deleteProject("P");
	}
}

public void testBug351498() throws CoreException, InterruptedException {
	IContentType javaContentType = Platform.getContentTypeManager().getContentType(JavaCore.JAVA_SOURCE_CONTENT_TYPE);
	try {
		// Create project and file
		assertNotNull("We should have got a Java Source content type!", javaContentType);
		javaContentType.addFileSpec("b351498", IContentType.FILE_EXTENSION_SPEC);
		IJavaProject javaProject = createJavaProject("P");
		createFolder("/P/p");
		String filePath = "/P/p/Bug.b351498";
		createFile(
			filePath,
			"package p;\n" +
			"public class Bug {}\n" +
			"class Secondary {}\n" +
			"class AnotherSecondary{}\n" +
			""
		);
		waitUntilIndexesReady();

		// Get the secondary type
		IType type = javaProject.findType("p.Secondary", new NullProgressMonitor());
		assertNotNull("We should have found the secondary type!", type);

		// Remove file extension
		javaContentType.removeFileSpec("b351498", IContentType.FILE_EXTENSION_SPEC);

		// As there's no specific event fo
		type = javaProject.findType("p.Secondary", new NullProgressMonitor());
		assertNull("We should have not found the secondary type!", type);
	} finally {
		deleteProject("P");
	}
}
}
