Bug 522022: [9][create on paste] paste into package explorer should
understand module-info.java

Change-Id: I91ce011e3bcb20b6414b7cb780ff0d99328de2e9
(cherry picked from commit d1a13bdf5e2266e22b7bd041967442287de5dd6e)
diff --git a/org.eclipse.jdt.ui/ui refactoring/org/eclipse/jdt/internal/ui/refactoring/reorg/PasteAction.java b/org.eclipse.jdt.ui/ui refactoring/org/eclipse/jdt/internal/ui/refactoring/reorg/PasteAction.java
index a4b1e18..ed26187 100644
--- a/org.eclipse.jdt.ui/ui refactoring/org/eclipse/jdt/internal/ui/refactoring/reorg/PasteAction.java
+++ b/org.eclipse.jdt.ui/ui refactoring/org/eclipse/jdt/internal/ui/refactoring/reorg/PasteAction.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2017 IBM Corporation and others.
+ * Copyright (c) 2000, 2018 IBM Corporation 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
@@ -363,6 +363,7 @@
 			private final int fKind;
 			private final String fTypeName;
 			private final String fPackageName;
+			private final boolean fIsModuleInfo;
 
 			public static List<ParsedCu> parseCus(IJavaProject javaProject, String compilerCompliance, String text) {
 				ASTParser parser= ASTParser.newParser(IASTSharedValues.SHARED_AST_LEVEL);
@@ -383,6 +384,17 @@
 				parser.setProject(javaProject);
 				parser.setSource(text.toCharArray());
 				parser.setStatementsRecovery(true);
+				parser.setUnitName(JavaModelUtil.MODULE_INFO_JAVA);
+				unit= (CompilationUnit) parser.createAST(null);
+				if (unit.getModule() != null) {
+					return Collections.singletonList(new ParsedCu(text, ASTParser.K_COMPILATION_UNIT, null, null, true));
+				} else {
+					parser.setUnitName(null);
+				}
+
+				parser.setProject(javaProject);
+				parser.setSource(text.toCharArray());
+				parser.setStatementsRecovery(true);
 				parser.setKind(ASTParser.K_CLASS_BODY_DECLARATIONS);
 				ASTNode root= parser.createAST(null);
 				if (root instanceof TypeDeclaration) {
@@ -454,10 +466,15 @@
 			}
 
 			private ParsedCu(String text, int kind, String typeName, String packageName) {
+				this(text, kind, typeName, packageName, false);
+			}
+
+			private ParsedCu(String text, int kind, String typeName, String packageName, boolean isModuleInfo) {
 				fText= text;
 				fTypeName= typeName;
 				fPackageName= packageName;
 				fKind= kind;
+				fIsModuleInfo= isModuleInfo;
 			}
 
 			public String getTypeName() {
@@ -729,25 +746,35 @@
 					pm.beginTask("", 4); //$NON-NLS-1$
 					try {
 						IPackageFragment destinationPack;
-						if (fDestinationPack != null) {
-							destinationPack= fDestinationPack;
+						if (parsedCu.fIsModuleInfo) {
+							destinationPack= fDestination.getPackageFragment(""); //$NON-NLS-1$ // the default package
 							pm.worked(1);
 						} else {
-							String packageName= parsedCu.getPackageName();
-							if (packageName == null)
-								packageName= ReorgMessages.PasteAction_snippet_default_package_name;
-							destinationPack= fDestination.getPackageFragment(packageName);
-							if (! destinationPack.exists()) {
-								JavaModelUtil.getPackageFragmentRoot(destinationPack).createPackageFragment(packageName, true, new SubProgressMonitor(pm, 1));
-							} else {
+							if (fDestinationPack != null) {
+								destinationPack= fDestinationPack;
 								pm.worked(1);
+							} else {
+								String packageName= parsedCu.getPackageName();
+								if (packageName == null)
+									packageName= ReorgMessages.PasteAction_snippet_default_package_name;
+								destinationPack= fDestination.getPackageFragment(packageName);
+								if (!destinationPack.exists()) {
+									JavaModelUtil.getPackageFragmentRoot(destinationPack).createPackageFragment(packageName, true, new SubProgressMonitor(pm, 1));
+								} else {
+									pm.worked(1);
+								}
 							}
 						}
 
 						String parsedText= Strings.trimIndentation(parsedCu.getText(), destinationPack.getJavaProject(), true);
 						int kind= parsedCu.getKind();
 						if (kind == ASTParser.K_COMPILATION_UNIT) {
-							final String cuName= parsedCu.getTypeName() + JavaModelUtil.DEFAULT_CU_SUFFIX;
+							final String cuName;
+							if (parsedCu.fIsModuleInfo) {
+								cuName= JavaModelUtil.MODULE_INFO_JAVA;
+							} else {
+								cuName= parsedCu.getTypeName() + JavaModelUtil.DEFAULT_CU_SUFFIX;
+							}
 							ICompilationUnit cu= destinationPack.getCompilationUnit(cuName);
 							boolean alreadyExists= cu.exists();
 							if (alreadyExists) {