update jdt.core to S4_13_0_M1
diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/ModuleBuilderTests.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/ModuleBuilderTests.java
index 8972339..940fc16 100644
--- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/ModuleBuilderTests.java
+++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/ModuleBuilderTests.java
@@ -8778,6 +8778,35 @@
 			deleteProject(prjD);
 		}
 	}
+	public void testBug547181Comment104() throws CoreException {
+
+		IJavaProject prjA = createJava9Project("A");
+		IJavaProject prjB = createJava9Project("B");
+		try {
+			// NO module-info.java, so A is accessed as automatic module
+			createFolder("A/src/pack/a");
+
+			createFile("A/src/pack/_some_resource_without_extension",
+					"dummy content\n");
+
+			addModularProjectEntry(prjB, prjA);
+			// ---1---
+			createFolder("B/src/pack/b");
+			createFile("B/src/pack/b/Usage.java",
+				"package pack.b;\n" + 
+				"public class Usage {\n" + 
+				"}\n");
+			createFile("B/src/module-info.java",
+					"module B {\n" + 
+					" requires A;\n" +
+					"}\n");
+			getWorkspace().build(IncrementalProjectBuilder.FULL_BUILD, null);
+			assertNoErrors();
+		} finally {
+			deleteProject(prjA);
+			deleteProject(prjB);
+		}
+	}
 	protected void assertNoErrors() throws CoreException {
 		for (IProject p : getWorkspace().getRoot().getProjects()) {
 			int maxSeverity = p.findMaxProblemSeverity(null, true, IResource.DEPTH_INFINITE);
diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/rewrite/describing/ASTRewritingStatementsTest.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/rewrite/describing/ASTRewritingStatementsTest.java
index acfcedc..bd6a6e6 100644
--- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/rewrite/describing/ASTRewritingStatementsTest.java
+++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/rewrite/describing/ASTRewritingStatementsTest.java
@@ -104,15 +104,6 @@
 		return createSuite(ASTRewritingStatementsTest.class);
 	}
 
-  	@Override
-	protected void setUp() throws Exception {
-		super.setUp();
-		if (this.apiLevel >= AST.JLS12 ) {
-			this.project1.setOption(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, JavaCore.ENABLED);
-			this.project1.setOption(JavaCore.COMPILER_PB_REPORT_PREVIEW_FEATURES, JavaCore.IGNORE);
-		}
-	}
-		
 	/** @deprecated using deprecated code */
 	private void internalSetExtraDimensions(VariableDeclarationFragment node, int dimensions) {
 		if (this.apiLevel < AST.JLS8) {
diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/rewrite/describing/ASTRewritingSwitchExpressionsTest.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/rewrite/describing/ASTRewritingSwitchExpressionsTest.java
index e604f74..f10badf 100644
--- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/rewrite/describing/ASTRewritingSwitchExpressionsTest.java
+++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/rewrite/describing/ASTRewritingSwitchExpressionsTest.java
@@ -17,7 +17,6 @@
 
 import org.eclipse.jdt.core.ICompilationUnit;
 import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.JavaCore;
 import org.eclipse.jdt.core.dom.AST;
 import org.eclipse.jdt.core.dom.ASTNode;
 import org.eclipse.jdt.core.dom.Block;
@@ -54,15 +53,6 @@
 		return createSuite(ASTRewritingSwitchExpressionsTest.class);
 	}
 
-  	@Override
-	protected void setUp() throws Exception {
-		super.setUp();
-		if (this.apiLevel >= AST.JLS12 ) {
-			this.project1.setOption(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, JavaCore.ENABLED);
-			this.project1.setOption(JavaCore.COMPILER_PB_REPORT_PREVIEW_FEATURES, JavaCore.IGNORE);
-		}
-	}
-	
 	@SuppressWarnings("rawtypes")
 	public void testSwitchExpressions_since_12() throws Exception {
 		IPackageFragment pack1= this.sourceFolder.createPackageFragment("test1", false, null);
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/LookupEnvironment.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/LookupEnvironment.java
index 2e5e3d7..35e8fd8 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/LookupEnvironment.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/LookupEnvironment.java
@@ -446,8 +446,8 @@
 private ReferenceBinding combine(ReferenceBinding one, ReferenceBinding two, ModuleBinding clientModule) {
 	if (one == null) return two;
 	if (two == null) return one;
-	if (!clientModule.canAccess(one.fPackage)) return two;
-	if (!clientModule.canAccess(two.fPackage)) return one;
+	if (one.fPackage == null || !clientModule.canAccess(one.fPackage)) return two;
+	if (two.fPackage == null || !clientModule.canAccess(two.fPackage)) return one;
 	if (one == two) return one; //$IDENTITY-COMPARISON$
 	return new ProblemReferenceBinding(one.compoundName, one, ProblemReasons.Ambiguous); // TODO(SHMOD): use a new problem ID
 }
@@ -1335,8 +1335,15 @@
 	} else {
 		packageBinding = getPackage0(compoundName[0]);
 		if (packageBinding == null || packageBinding == TheNotFoundPackage) {
-			packageBinding = new PlainPackageBinding(compoundName[0], this, this.module);
-			packageBinding = this.module.addPackage(packageBinding, true);
+			packageBinding = this.module.getOrCreateDeclaredPackage(new char[][] {compoundName[0]});
+			if (this.useModuleSystem) {
+				char[][] declaringModuleNames = null;
+				if (this.module.isUnnamed()) {
+					IModuleAwareNameEnvironment moduleEnv = (IModuleAwareNameEnvironment) this.nameEnvironment;
+					declaringModuleNames = moduleEnv.getUniqueModulesDeclaringPackage(new char[][] {packageBinding.readableName()}, ModuleBinding.ANY);
+				}
+				packageBinding = this.module.combineWithPackagesFromOtherRelevantModules(packageBinding, packageBinding.compoundName, declaringModuleNames);
+			}
 			this.knownPackages.put(compoundName[0], packageBinding); // update in case of split package
 		}
 	}
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/ModuleBinding.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/ModuleBinding.java
index e63a5e2..741b9ef 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/ModuleBinding.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/ModuleBinding.java
@@ -549,18 +549,7 @@
 	 * </p>
 	 */
 	public PackageBinding getTopLevelPackage(char[] name) {
-		// check cache:
-		PackageBinding binding = this.environment.getPackage0(name);
-		if (binding != null)
-			return binding == LookupEnvironment.TheNotFoundPackage ? null : binding;
-		binding = getVisiblePackage(null, name);
-		// remember:
-		if (binding != null) {
-			this.environment.knownPackages.put(name, binding);
-		} else {
-			this.environment.knownPackages.put(name, LookupEnvironment.TheNotFoundPackage);
-		}
-		return binding;
+		return getVisiblePackage(null, name);
 	}
 
 	PlainPackageBinding getDeclaredPackage(char[] flatName) {
@@ -579,7 +568,7 @@
 			if (pkg == LookupEnvironment.TheNotFoundPackage)
 				return null;
 			else
-				return addPackage(pkg, false);
+				return pkg;
 		}
 
 		// check cached plain PackageBinding in declaredPackages (which may need combining with siblings):
@@ -604,7 +593,7 @@
 						}
 						if (binding == null) {
 							// declared here, not yet known, so create it now:
-							binding = new PlainPackageBinding(subPkgCompoundName, parent, this.environment, this);
+							binding = this.createDeclaredPackage(subPkgCompoundName, parent);
 						}
 					} else {
 						// visible but foreign (when current is unnamed or auto):
@@ -612,14 +601,7 @@
 							ModuleBinding declaringModule = this.environment.root.getModule(declaringModuleName);
 							if (declaringModule != null) {
 								PlainPackageBinding declaredPackage = declaringModule.getDeclaredPackage(fullFlatName);
-								if (declaredPackage != null) {
-									// don't add foreign package to 'parent' (below), but to its own parent:
-									if (declaredPackage.parent != null)
-										declaredPackage.parent.addPackage(declaredPackage, declaringModule);
-									parent = null;
-									//
-									binding = SplitPackageBinding.combine(declaredPackage, binding, this);
-								}
+								binding = SplitPackageBinding.combine(declaredPackage, binding, this);
 							}
 						}
 					}
@@ -627,32 +609,32 @@
 			}
 		} else {
 			if (this.environment.nameEnvironment.isPackage(parentName, name))
-				binding = new PlainPackageBinding(subPkgCompoundName, parent, this.environment, this);
+				binding = this.createDeclaredPackage(subPkgCompoundName, parent);
 		}
-
-		// enrich with split-siblings from visible modules:
-		if (parent != null && binding != null)
-			parent.addPackage(binding, this); // preliminarily add to avoid creating duplicates, will be updated below
+		
 		binding = combineWithPackagesFromOtherRelevantModules(binding, subPkgCompoundName, declaringModuleNames);
+
+		assert binding == null || binding instanceof PlainPackageBinding || binding.enclosingModule == this;
+		
 		if (binding == null || !binding.isValidBinding()) {
-			if (parent != null
-					&& !(parent instanceof SplitPackageBinding)) // don't store problem into SPB, because from different focus things may look differently
-			{
+			if (parent != null) {
 				if (binding == null) {
 					parent.addNotFoundPackage(name);
 				} else {
 					parent.knownPackages.put(name, binding);
 				}
+			} else {
+				this.environment.knownPackages.put(name, LookupEnvironment.TheNotFoundPackage);
 			}
 			return null;
 		}
 		// remember
 		if (parentName.length == 0) {
-			binding.environment.knownPackages.put(name, binding);
+			this.environment.knownPackages.put(name, binding);
 		} else if (parent != null) {
 			binding = parent.addPackage(binding, this);
 		}
-		return addPackage(binding, false);
+		return binding;
 	}
 
 	/**
@@ -683,36 +665,7 @@
 		return parent;
 	}
 
-	/**
-	 * Check if the given package is declared in this module,
-	 * and if so, remember this fact for later.
-	 * The package can be a {@code SplitPackageBinding} in which case
-	 * only one of its incarnations needs to be declared in this module.
-	 * @param packageBinding the package to add
-	 * @param checkForSplit if true then we should try to construct a split package from
-	 * 	same named packages in required modules.
-	 * @return the given package, possibly enriched to a {@link SplitPackageBinding}
-	 */
-	PackageBinding addPackage(PackageBinding packageBinding, boolean checkForSplit) {
-		if (packageBinding.isDeclaredIn(this)) {
-			char[] packageName = packageBinding.readableName();
-			if (checkForSplit && this.environment.useModuleSystem) {
-				char[][] declaringModuleNames = null;
-				if (isUnnamed()) {
-					IModuleAwareNameEnvironment moduleEnv = (IModuleAwareNameEnvironment) this.environment.nameEnvironment;
-					declaringModuleNames = moduleEnv.getUniqueModulesDeclaringPackage(new char[][] {packageName}, ANY);
-				}
-				packageBinding = combineWithPackagesFromOtherRelevantModules(packageBinding, packageBinding.compoundName, declaringModuleNames);
-			}
-			this.declaredPackages.put(packageName, packageBinding.getIncarnation(this));
-			if (packageBinding.parent == null) {
-				this.environment.knownPackages.put(packageName, packageBinding);
-			}
-		}
-		return packageBinding;
-	}
-	
-	private PackageBinding combineWithPackagesFromOtherRelevantModules(PackageBinding currentBinding, char[][] compoundName, char[][] declaringModuleNames) {
+	PackageBinding combineWithPackagesFromOtherRelevantModules(PackageBinding currentBinding, char[][] compoundName, char[][] declaringModuleNames) {
 		for (ModuleBinding moduleBinding : otherRelevantModules(declaringModuleNames)) {
 			PlainPackageBinding nextBinding = moduleBinding.getDeclaredPackage(CharOperation.concatWith(compoundName, '.'));
 			currentBinding = SplitPackageBinding.combine(nextBinding, currentBinding, this);
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/PlainPackageBinding.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/PlainPackageBinding.java
index 97ea1a2..894a710 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/PlainPackageBinding.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/PlainPackageBinding.java
@@ -20,12 +20,12 @@
 
 	/** Create a toplevel package. */
 	public PlainPackageBinding(char[] topLevelPackageName, LookupEnvironment environment, ModuleBinding enclosingModule) {
-		super(new char[][] {topLevelPackageName}, null, environment, enclosingModule);
+		this(new char[][] {topLevelPackageName}, null, environment, enclosingModule);
 	}
 
 	/** Create a default package. */
 	public PlainPackageBinding(LookupEnvironment environment) {
-		super(CharOperation.NO_CHAR_CHAR, null, environment, environment.module);
+		this(CharOperation.NO_CHAR_CHAR, null, environment, environment.module);
 	}
 
 	/** Create a normal package. */
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/internal/core/dom/NaiveASTFlattener.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/internal/core/dom/NaiveASTFlattener.java
index cd266bf..ca374e5 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/internal/core/dom/NaiveASTFlattener.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/internal/core/dom/NaiveASTFlattener.java
@@ -462,18 +462,18 @@
 
 	@Override
 	public boolean visit(BreakStatement node) {
-		if (node.getAST().apiLevel() >= JLS12 && node.getAST().isPreviewEnabled() && node.isImplicit()  && node.getExpression() == null) {
+		if (node.getAST().apiLevel() >= JLS12 && node.isImplicit()  && node.getExpression() == null) {
 			return false;
 		}
 		printIndent();
-		if (node.getAST().apiLevel() < JLS12 || (node.getAST().apiLevel() >= JLS12 && node.getAST().isPreviewEnabled() && !node.isImplicit())) {
+		if (node.getAST().apiLevel() < JLS12 || (node.getAST().apiLevel() >= JLS12 && !node.isImplicit())) {
 			this.buffer.append("break"); //$NON-NLS-1$
 		}
 		if (node.getLabel() != null) {
 			this.buffer.append(" ");//$NON-NLS-1$
 			node.getLabel().accept(this);
 		}
-		if (node.getAST().apiLevel() >= JLS12 && node.getAST().isPreviewEnabled()) {
+		if (node.getAST().apiLevel() >= JLS12) {
 			if (node.getExpression() != null) {
 				this.buffer.append(" ");//$NON-NLS-1$
 				node.getExpression().accept(this);
@@ -1520,7 +1520,7 @@
 
 	@Override
 	public boolean visit(SwitchCase node) {
-		if (node.getAST().apiLevel() >= JLS12 && node.getAST().isPreviewEnabled()) {
+		if (node.getAST().apiLevel() >= JLS12) {
 			if (node.isDefault()) {
 				this.buffer.append("default");//$NON-NLS-1$
 				this.buffer.append(node.isSwitchLabeledRule() ? " ->" : ":");//$NON-NLS-1$ //$NON-NLS-2$
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteAnalyzer.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteAnalyzer.java
index 1e6c428..22ee192 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteAnalyzer.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteAnalyzer.java
@@ -2604,7 +2604,7 @@
 		try {
 			int offset= getScanner().getTokenEndOffset(TerminalTokens.TokenNamebreak, node.getStartPosition());
 			rewriteNode(node, BreakStatement.LABEL_PROPERTY, offset, ASTRewriteFormatter.SPACE); // space between break and label
-			if (node.getAST().apiLevel() >= JLS12_INTERNAL && node.getAST().isPreviewEnabled()) {
+			if (node.getAST().apiLevel() >= JLS12_INTERNAL) {
 				rewriteNode(node, BreakStatement.EXPRESSION_PROPERTY, offset, ASTRewriteFormatter.SPACE); // space between break and label
 			}
 		} catch (CoreException e) {
@@ -3570,7 +3570,7 @@
 		}
 
 		// dont allow switching from case to default or back. New statements should be created.
-		if (node.getAST().apiLevel() >= JLS12_INTERNAL && node.getAST().isPreviewEnabled()) {
+		if (node.getAST().apiLevel() >= JLS12_INTERNAL) {
 			int pos = node.expressions().size() == 0 ? node.getStartPosition() :
 					rewriteNodeList(node, SwitchCase.EXPRESSIONS2_PROPERTY, node.getStartPosition(), Util.EMPTY_STRING, ", "); //$NON-NLS-1$
 			if (isChanged(node, SwitchCase.SWITCH_LABELED_RULE_PROPERTY)) {
@@ -3794,7 +3794,7 @@
 					insertIndent++;
 				}
 				ParagraphListRewriter listRewriter;
-				if (node.getAST().apiLevel() >= JLS12_INTERNAL && node.getAST().isPreviewEnabled()) {
+				if (node.getAST().apiLevel() >= JLS12_INTERNAL) {
 					listRewriter= new SwitchListLabeledRuleRewriter(insertIndent);
 				} else {
 					listRewriter= new SwitchListRewriter(insertIndent);
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteFlattener.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteFlattener.java
index 7e7aa32..5f07b07 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteFlattener.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteFlattener.java
@@ -396,11 +396,11 @@
 
 	@Override
 	public boolean visit(BreakStatement node) {
-		if (node.getAST().apiLevel() >= JLS12 && node.getAST().isPreviewEnabled() && node.isImplicit()  && node.getExpression() == null) {
+		if (node.getAST().apiLevel() >= JLS12 && node.isImplicit()  && node.getExpression() == null) {
 			return false;
 		}
 		
-		if (node.getAST().apiLevel() < JLS12 || (node.getAST().apiLevel() >= JLS12 && node.getAST().isPreviewEnabled() && !node.isImplicit())) {
+		if (node.getAST().apiLevel() < JLS12 || (node.getAST().apiLevel() >= JLS12 && !node.isImplicit())) {
 			this.result.append("break"); //$NON-NLS-1$
 		}
 		ASTNode label= getChildNode(node, BreakStatement.LABEL_PROPERTY);
@@ -408,7 +408,7 @@
 			this.result.append(' ');
 			label.accept(this);
 		}
-		if (node.getAST().apiLevel() >= JLS12 && node.getAST().isPreviewEnabled()) {
+		if (node.getAST().apiLevel() >= JLS12) {
 			ASTNode expression = getChildNode(node, BreakStatement.EXPRESSION_PROPERTY);
 			if (expression != null ) {
 				this.result.append(' ');
@@ -1032,7 +1032,7 @@
 
 	@Override
 	public boolean visit(SwitchCase node) {
-		if (node.getAST().apiLevel() >= JLS12 && node.getAST().isPreviewEnabled()) {
+		if (node.getAST().apiLevel() >= JLS12) {
 			if (node.isDefault()) {
 				this.result.append("default");//$NON-NLS-1$
 				this.result.append(getBooleanAttribute(node, SwitchCase.SWITCH_LABELED_RULE_PROPERTY) ? " ->" : ":");//$NON-NLS-1$ //$NON-NLS-2$
diff --git a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/builder/ClasspathDirectory.java b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/builder/ClasspathDirectory.java
index ba43b14..623f116 100644
--- a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/builder/ClasspathDirectory.java
+++ b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/builder/ClasspathDirectory.java
@@ -259,7 +259,8 @@
 	IPath basePath = this.binaryFolder.getFullPath();
 	try {
 		this.binaryFolder.accept(r -> {
-			if (r instanceof IFile && SuffixConstants.EXTENSION_class.equals(r.getFileExtension().toLowerCase())) {
+			String extension = r.getFileExtension();
+			if (r instanceof IFile && extension != null && SuffixConstants.EXTENSION_class.equals(extension.toLowerCase())) {
 				packageNames.add(r.getParent().getFullPath().makeRelativeTo(basePath).toString().replace('/', '.'));
 			}
 			return true;
diff --git a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/builder/ClasspathMultiDirectory.java b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/builder/ClasspathMultiDirectory.java
index 9c6865e..fd384f2 100644
--- a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/builder/ClasspathMultiDirectory.java
+++ b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/builder/ClasspathMultiDirectory.java
@@ -91,7 +91,8 @@
 						dirList[index++] = name;
 					}
 				}
-			} else {
+			}
+			if(index==0) {
 				container = this.sourceFolder.findMember(qualifiedPackageName);
 				if (container instanceof IContainer) {
 					members = ((IContainer) container).members();