|  | 
| 24 | 24 |  * SOFTWARE. | 
| 25 | 25 |  */ | 
| 26 | 26 | 
 | 
| 27 |  | -import org.codehaus.plexus.compiler.AbstractCompiler; | 
| 28 |  | -import org.codehaus.plexus.compiler.Compiler; | 
| 29 |  | -import org.codehaus.plexus.compiler.CompilerConfiguration; | 
| 30 |  | -import org.codehaus.plexus.compiler.CompilerException; | 
| 31 |  | -import org.codehaus.plexus.compiler.CompilerMessage; | 
| 32 |  | -import org.codehaus.plexus.compiler.CompilerOutputStyle; | 
| 33 |  | -import org.codehaus.plexus.compiler.CompilerResult; | 
| 34 |  | -import org.codehaus.plexus.component.annotations.Component; | 
| 35 |  | -import org.codehaus.plexus.util.DirectoryScanner; | 
| 36 |  | -import org.codehaus.plexus.util.StringUtils; | 
| 37 |  | -import org.eclipse.jdt.core.compiler.CompilationProgress; | 
| 38 |  | -import org.eclipse.jdt.core.compiler.batch.BatchCompiler; | 
| 39 |  | - | 
| 40 | 27 | import javax.tools.Diagnostic; | 
| 41 | 28 | import javax.tools.DiagnosticListener; | 
| 42 | 29 | import javax.tools.JavaCompiler; | 
| 43 | 30 | import javax.tools.JavaFileObject; | 
| 44 | 31 | import javax.tools.StandardJavaFileManager; | 
|  | 32 | + | 
| 45 | 33 | import java.io.File; | 
| 46 | 34 | import java.io.PrintWriter; | 
| 47 | 35 | import java.io.StringWriter; | 
|  | 
| 56 | 44 | import java.util.ServiceLoader; | 
| 57 | 45 | import java.util.Set; | 
| 58 | 46 | 
 | 
|  | 47 | +import org.codehaus.plexus.compiler.AbstractCompiler; | 
|  | 48 | +import org.codehaus.plexus.compiler.Compiler; | 
|  | 49 | +import org.codehaus.plexus.compiler.CompilerConfiguration; | 
|  | 50 | +import org.codehaus.plexus.compiler.CompilerException; | 
|  | 51 | +import org.codehaus.plexus.compiler.CompilerMessage; | 
|  | 52 | +import org.codehaus.plexus.compiler.CompilerOutputStyle; | 
|  | 53 | +import org.codehaus.plexus.compiler.CompilerResult; | 
|  | 54 | +import org.codehaus.plexus.component.annotations.Component; | 
|  | 55 | +import org.codehaus.plexus.util.DirectoryScanner; | 
|  | 56 | +import org.codehaus.plexus.util.StringUtils; | 
|  | 57 | +import org.eclipse.jdt.core.compiler.CompilationProgress; | 
|  | 58 | +import org.eclipse.jdt.core.compiler.batch.BatchCompiler; | 
|  | 59 | + | 
| 59 | 60 | /** | 
| 60 | 61 |  * | 
| 61 | 62 |  */ | 
| @@ -206,7 +207,14 @@ public CompilerResult performCompile( CompilerConfiguration config ) | 
| 206 | 207 | 
 | 
| 207 | 208 |                 if ( processorPathEntries != null && processorPathEntries.size() > 0 ) | 
| 208 | 209 |                 { | 
| 209 |  | -                    args.add( "-processorpath" ); | 
|  | 210 | +                    if ( isReplaceProcessorPath( config ) ) | 
|  | 211 | +                    { | 
|  | 212 | +                        args.add( "--processor-module-path" ); | 
|  | 213 | +                    } | 
|  | 214 | +                    else | 
|  | 215 | +                    { | 
|  | 216 | +                        args.add( "-processorpath" ); | 
|  | 217 | +                    } | 
| 210 | 218 |                     args.add( getPathString( processorPathEntries ) ); | 
| 211 | 219 |                 } | 
| 212 | 220 | 
 | 
| @@ -478,6 +486,22 @@ public void worked( int i, int i1 ) | 
| 478 | 486 |         } | 
| 479 | 487 |     } | 
| 480 | 488 | 
 | 
|  | 489 | +    private static final String OPT_REPLACE_PROCESSOR_PATH = "replaceProcessorPathWithProcessorModulePath"; | 
|  | 490 | +    private static final String OPT_REPLACE_PROCESSOR_PATH_ = "-" + OPT_REPLACE_PROCESSOR_PATH; | 
|  | 491 | + | 
|  | 492 | +    static boolean isReplaceProcessorPath( CompilerConfiguration config ) | 
|  | 493 | +    { | 
|  | 494 | +        for ( Entry<String, String> entry : config.getCustomCompilerArgumentsEntries() ) | 
|  | 495 | +        { | 
|  | 496 | +            String opt = entry.getKey(); | 
|  | 497 | +            if ( opt.equals( OPT_REPLACE_PROCESSOR_PATH ) || opt.equals( OPT_REPLACE_PROCESSOR_PATH_ ) ) | 
|  | 498 | +            { | 
|  | 499 | +                return true; | 
|  | 500 | +            } | 
|  | 501 | +        } | 
|  | 502 | +        return false; | 
|  | 503 | +    } | 
|  | 504 | + | 
| 481 | 505 |     static List<String> resortSourcesToPutModuleInfoFirst( List<String> allSources ) | 
| 482 | 506 |     { | 
| 483 | 507 |         ArrayList<String> resorted = new ArrayList<>(); | 
| @@ -538,46 +562,49 @@ static boolean processCustomArguments( CompilerConfiguration config, List<String | 
| 538 | 562 |                 continue; | 
| 539 | 563 |             } | 
| 540 | 564 | 
 | 
| 541 |  | -            /* | 
| 542 |  | -            * The compiler mojo makes quite a mess of passing arguments, depending on exactly WHICH | 
| 543 |  | -            * way is used to pass them. The method method using <compilerArguments> uses the tag names | 
| 544 |  | -            * of its contents to denote option names, and so the compiler mojo happily adds a '-' to | 
| 545 |  | -            * all of the names there and adds them to the "custom compiler arguments" map as a | 
| 546 |  | -            * name, value pair where the name always contains a single '-'. The Eclipse compiler (and | 
| 547 |  | -            * javac too, btw) has options with two dashes (like --add-modules for java 9). These cannot | 
| 548 |  | -            * be passed using a <compilerArguments> tag. | 
| 549 |  | -            * | 
| 550 |  | -            * The other method is to use <compilerArgs>, where each SINGLE argument needs to be passed | 
| 551 |  | -            * using an <arg>xxxx</arg> tag. In there the xxx is not manipulated by the compiler mojo, so | 
| 552 |  | -            * if it starts with a dash or more dashes these are perfectly preserved. But of course these | 
| 553 |  | -            * single <arg> entries are not a pair. So the compiler mojo adds them as pairs of (xxxx, null). | 
| 554 |  | -            * | 
| 555 |  | -            * We use that knowledge here: if a pair has a null value then do not mess up the key but | 
| 556 |  | -            * render it as a single value. This should ensure that something like: | 
| 557 |  | -            * <compilerArgs> | 
| 558 |  | -            *     <arg>--add-modules</arg> | 
| 559 |  | -            *     <arg>java.se.ee</arg> | 
| 560 |  | -            * </compilerArgs> | 
| 561 |  | -            * | 
| 562 |  | -            * is actually added to the command like as such. | 
| 563 |  | -            * | 
| 564 |  | -            * (btw: the above example will still give an error when using ecj <= 4.8M6: | 
| 565 |  | -            *      invalid module name: java.se.ee | 
| 566 |  | -            * but that seems to be a bug in ecj). | 
| 567 |  | -            */ | 
| 568 |  | -            if ( null == optionValue ) | 
| 569 |  | -            { | 
| 570 |  | -                //-- We have an option from compilerArgs: use the key as-is as a single option value | 
| 571 |  | -                args.add( opt ); | 
| 572 |  | -            } | 
| 573 |  | -            else | 
|  | 565 | +            if ( !opt.equals( OPT_REPLACE_PROCESSOR_PATH ) && !opt.equals( OPT_REPLACE_PROCESSOR_PATH_ ) ) | 
| 574 | 566 |             { | 
| 575 |  | -                if ( !opt.startsWith( "-" ) ) | 
|  | 567 | +                /* | 
|  | 568 | +                 * The compiler mojo makes quite a mess of passing arguments, depending on exactly WHICH | 
|  | 569 | +                 * way is used to pass them. The method method using <compilerArguments> uses the tag names | 
|  | 570 | +                 * of its contents to denote option names, and so the compiler mojo happily adds a '-' to | 
|  | 571 | +                 * all of the names there and adds them to the "custom compiler arguments" map as a | 
|  | 572 | +                 * name, value pair where the name always contains a single '-'. The Eclipse compiler (and | 
|  | 573 | +                 * javac too, btw) has options with two dashes (like --add-modules for java 9). These cannot | 
|  | 574 | +                 * be passed using a <compilerArguments> tag. | 
|  | 575 | +                 * | 
|  | 576 | +                 * The other method is to use <compilerArgs>, where each SINGLE argument needs to be passed | 
|  | 577 | +                 * using an <arg>xxxx</arg> tag. In there the xxx is not manipulated by the compiler mojo, so | 
|  | 578 | +                 * if it starts with a dash or more dashes these are perfectly preserved. But of course these | 
|  | 579 | +                 * single <arg> entries are not a pair. So the compiler mojo adds them as pairs of (xxxx, null). | 
|  | 580 | +                 * | 
|  | 581 | +                 * We use that knowledge here: if a pair has a null value then do not mess up the key but | 
|  | 582 | +                 * render it as a single value. This should ensure that something like: | 
|  | 583 | +                 * <compilerArgs> | 
|  | 584 | +                 *     <arg>--add-modules</arg> | 
|  | 585 | +                 *     <arg>java.se.ee</arg> | 
|  | 586 | +                 * </compilerArgs> | 
|  | 587 | +                 * | 
|  | 588 | +                 * is actually added to the command like as such. | 
|  | 589 | +                 * | 
|  | 590 | +                 * (btw: the above example will still give an error when using ecj <= 4.8M6: | 
|  | 591 | +                 *      invalid module name: java.se.ee | 
|  | 592 | +                 * but that seems to be a bug in ecj). | 
|  | 593 | +                 */ | 
|  | 594 | +                if ( null == optionValue ) | 
|  | 595 | +                { | 
|  | 596 | +                    //-- We have an option from compilerArgs: use the key as-is as a single option value | 
|  | 597 | +                    args.add( opt ); | 
|  | 598 | +                } | 
|  | 599 | +                else | 
| 576 | 600 |                 { | 
| 577 |  | -                    opt = "-" + opt; | 
|  | 601 | +                    if ( !opt.startsWith( "-" ) ) | 
|  | 602 | +                    { | 
|  | 603 | +                        opt = "-" + opt; | 
|  | 604 | +                    } | 
|  | 605 | +                    args.add( opt ); | 
|  | 606 | +                    args.add( optionValue ); | 
| 578 | 607 |                 } | 
| 579 |  | -                args.add( opt ); | 
| 580 |  | -                args.add( optionValue ); | 
| 581 | 608 |             } | 
| 582 | 609 |         } | 
| 583 | 610 |         return result; | 
|  | 
0 commit comments