From 85a827a7f269a18a0c80802811bbc2aa3766c2e4 Mon Sep 17 00:00:00 2001 From: mkersten Date: Sat, 25 Jan 2003 01:25:30 +0000 Subject: [PATCH] Committed patches specified in: http://bugs.eclipse.org/bugs/show_bug.cgi?id=29769 --- .../tools/ajbrowser/BrowserProperties.java | 18 + .../org/aspectj/ajde/BuildOptionsAdapter.java | 85 ++- .../ajde/ProjectPropertiesAdapter.java | 38 +- .../ajde/internal/AspectJBuildManager.java | 44 +- .../ajde/internal/CompilerAdapter.java | 263 ++++++++- .../ajde/ui/internal/AjcBuildOptions.java | 167 +++++- .../figures-coverage/figures/Figure.java | 6 +- ajde/testsrc/org/aspectj/ajde/AjdeTests.java | 1 + .../aspectj/ajde/BuildConfigurationTests.java | 506 ++++++++++++++++++ .../org/aspectj/ajde/BuildOptionsTest.java | 96 ++++ .../org/aspectj/ajde/NullIdeManager.java | 2 + .../org/aspectj/ajde/NullIdeProperties.java | 35 +- .../ajde/StructureModelRegressionTest.java | 37 +- .../org/aspectj/ajde/StructureModelTest.java | 9 +- .../ajde/ui/StructureViewManagerTest.java | 1 + .../org/aspectj/ajdt/ajc/BuildArgParser.java | 4 +- .../internal/core/builder/AjBuildConfig.java | 73 ++- .../ajdt/ajc/BuildArgParserTestCase.java | 2 +- 18 files changed, 1349 insertions(+), 38 deletions(-) create mode 100644 ajde/testsrc/org/aspectj/ajde/BuildConfigurationTests.java diff --git a/ajbrowser/src/org/aspectj/tools/ajbrowser/BrowserProperties.java b/ajbrowser/src/org/aspectj/tools/ajbrowser/BrowserProperties.java index 9c69722ce..86810b961 100644 --- a/ajbrowser/src/org/aspectj/tools/ajbrowser/BrowserProperties.java +++ b/ajbrowser/src/org/aspectj/tools/ajbrowser/BrowserProperties.java @@ -9,6 +9,7 @@ * * Contributors: * Xerox/PARC initial implementation + * AMC 01.20.2003 extended for new AspectJ 1.1 project options * ******************************************************************/ @@ -143,4 +144,21 @@ public class BrowserProperties implements ProjectPropertiesAdapter { public void setAjcWorkingDir(String path) { preferencesAdapter.setProjectPreference("build.workingdir", path); } + + // 1.1 options + public Set getInJars( ) { + return null; + } + + public String getOutJar( ) { + return null; + } + + public Set getSourceRoots( ) { + return null; + } + + public Set getAspectPath( ) { + return null; + } } diff --git a/ajde/src/org/aspectj/ajde/BuildOptionsAdapter.java b/ajde/src/org/aspectj/ajde/BuildOptionsAdapter.java index edf4c0972..7e89a55fa 100644 --- a/ajde/src/org/aspectj/ajde/BuildOptionsAdapter.java +++ b/ajde/src/org/aspectj/ajde/BuildOptionsAdapter.java @@ -8,61 +8,100 @@ * http://www.eclipse.org/legal/cpl-v10.html * * Contributors: - * Xerox/PARC initial implementation + * Xerox/PARC initial implementation + * AMC 01.20.2003 extended for AspectJ 1.1 compiler options * ******************************************************************/ package org.aspectj.ajde; +import java.util.Set; + /** * When a particular option is not set its documented default is used. */ public interface BuildOptionsAdapter { + // Version constants + public static final String VERSION_13 = "1.3"; + public static final String VERSION_14 = "1.4"; + + // Warning constants + public static final String WARN_CONSTRUCTOR_NAME = "constructorName"; + public static final String WARN_PACKAGE_DEFAULT_METHOD = "packageDefaultMethod"; + public static final String WARN_DEPRECATION = "deprecation"; + public static final String WARN_MASKED_CATCH_BLOCKS = "maskedCatchBlocks"; + public static final String WARN_UNUSED_LOCALS = "unusedLocals"; + public static final String WARN_UNUSED_ARGUMENTS = "unusedArguments"; + public static final String WARN_UNUSED_IMPORTS = "unusedImports"; + public static final String WARN_SYNTHETIC_ACCESS = "syntheticAccess"; + public static final String WARN_ASSERT_IDENITIFIER = "assertIdentifier"; + public static final String WARN_NLS = "nonExternalisedString"; + + // Debug constants + public static final String DEBUG_SOURCE = "source"; + public static final String DEBUG_LINES = "lines"; + public static final String DEBUG_VARS = "vars"; + public static final String DEBUG_ALL = "all"; + /** * Use javac to generate .class files. The default is "false". + * From -usejavac + * @deprecated Not supported from AspectJ 1.1 onwards */ public boolean getUseJavacMode(); /** * Only relevant with Use Javac or Preprocess modes. Specify where to place * intermediate .java files. The default is "workingdir". + * From -workingdir + * @deprecated Not supported from AspectJ 1.1 onwards */ public String getWorkingOutputPath(); /** * Generate regular Java code into the Working OutputPath. Don't try to generate * any .class files. The default is "false". + * From -source + * @deprecated Not supported from AspectJ 1.1 onwards */ public boolean getPreprocessMode(); /** * Specify character encoding used by source files. The default is the current * JVM's default. + * From -encoding */ public String getCharacterEncoding(); /** * Support assertions as defined in JLS-1.4. The default is "false". + * @deprecated Use getComplianceLevel instead */ public boolean getSourceOnePointFourMode(); /** * Be extra-lenient in interpreting the Java specification. The default is "false", * i.e. "regular" mode. + * From -lenient + * @deprecated Not supported from AspectJ 1.1 onwards */ public boolean getLenientSpecMode(); /** * Be extra-strict in interpreting the Java specification. The default is "false", * i.e. "regular" mode. + * From -strict + * @deprecated Not supported from AspectJ 1.1 onwards */ public boolean getStrictSpecMode(); /** * Make the use of some features from pre-1.0 versions of AspectJ be warnings to ease * porting of old code. The default is "false". + * From -porting + * @deprecated Not supported from AspectJ 1.1 onwards */ public boolean getPortingMode(); @@ -71,4 +110,48 @@ public interface BuildOptionsAdapter { * The default is no non-standard options. */ public String getNonStandardOptions(); + + // ---------------------------------- + // New options added for AspectJ 1.1 from this point onwards + + /** + * JDK Compliance level to be used by the compiler, either + * VERSION_13 or VERSION_14. + * From -1.3 / -1.4 + */ + public String getComplianceLevel(); + + /** + * Source compatibility level, either VERSION_13 or VERSION_14. + * From -source (eclipse option) + */ + public String getSourceCompatibilityLevel(); + + /** + * Optional warnings, empty List is equivalent to -warn:none, + * returning null uses eclipse compiler default settings + * From -warn:xxx,yyy + */ + public Set getWarnings(); + + /** + * Debug level. DEBUG_ALL == {SOURCE, LINES, VARS}. + * Empty list is equivalent to -g:none, returning + * non uses eclipse compiler default settings + * From -g:xxx + */ + public Set getDebugLevel(); + + /** + * No errors generated for unresolved imports + * From -noImportError + */ + public boolean getNoImportError(); + + /** + * Preserve all unused local variables (for debug) + * From -preserveAllLocals + */ + public boolean getPreserveAllLocals(); + } diff --git a/ajde/src/org/aspectj/ajde/ProjectPropertiesAdapter.java b/ajde/src/org/aspectj/ajde/ProjectPropertiesAdapter.java index e24307320..472a8425d 100644 --- a/ajde/src/org/aspectj/ajde/ProjectPropertiesAdapter.java +++ b/ajde/src/org/aspectj/ajde/ProjectPropertiesAdapter.java @@ -8,13 +8,15 @@ * http://www.eclipse.org/legal/cpl-v10.html * * Contributors: - * Xerox/PARC initial implementation + * Xerox/PARC initial implementation + * AMC 01.20.2003 extended for AspectJ 1.1 compiler options * ******************************************************************/ package org.aspectj.ajde; +import java.util.Set; import java.util.List; /** @@ -55,4 +57,38 @@ public interface ProjectPropertiesAdapter { public String getExecutionArgs(); public String getVmArgs(); + + // following methods added for AspectJ 1.1 + //----------------------------------------- + + /** + * Get the set of input jar files for this compilation. + * Set members should be of type java.io.File. + * An empty set or null is acceptable for this option. + * From -injars. + */ + public Set getInJars(); + + /** + * Get the output jar file for the compilation results. + * Return null to leave classfiles unjar'd in output directory + * From -outjar + */ + public String getOutJar(); + + /** + * Get a set of root source directories for the compilation. + * Set members should be of type java.io.File + * Returning null or an empty set disables the option. + * From -sourceroots + */ + public Set getSourceRoots(); + + /** + * Get the set of aspect jar files to be used for the compilation. + * Returning null or an empty set disables this option. Set members + * should be of type java.io.File. + * From -aspectpath + */ + public Set getAspectPath(); } diff --git a/ajde/src/org/aspectj/ajde/internal/AspectJBuildManager.java b/ajde/src/org/aspectj/ajde/internal/AspectJBuildManager.java index a52117e38..1c3e201d8 100644 --- a/ajde/src/org/aspectj/ajde/internal/AspectJBuildManager.java +++ b/ajde/src/org/aspectj/ajde/internal/AspectJBuildManager.java @@ -238,19 +238,49 @@ public class AspectJBuildManager implements BuildManager { notifyCompileFinished(configFile, lastCompileTime, succeeded, warnings); } + // AMC - updated for AspectJ 1.1 options private String getFormattedOptionsString(BuildOptionsAdapter buildOptions, ProjectPropertiesAdapter properties) { return "Building with settings: " + "\n-> output path: " + properties.getOutputPath() + "\n-> classpath: " + properties.getClasspath() + "\n-> bootclasspath: " + properties.getBootClasspath() + + "\n-> -injars " + formatSet(properties.getInJars()) + + "\n-> -outjar " + formatOptionalString(properties.getOutJar()) + + "\n-> -sourceroots " + formatSet(properties.getSourceRoots()) + + "\n-> -aspectpath " + formatSet(properties.getAspectPath()) + + "\n-> -" + buildOptions.getComplianceLevel() + + "\n-> -source " + buildOptions.getSourceCompatibilityLevel() + + "\n-> -g:" + formatSet(buildOptions.getDebugLevel()) + + "\n-> -warn:" + formatSet(buildOptions.getWarnings()) + + "\n-> noImportError: " + buildOptions.getNoImportError() + + "\n-> preserveAllLocals:" + buildOptions.getPreserveAllLocals() + "\n-> non-standard options: " + buildOptions.getNonStandardOptions() - + "\n-> porting mode: " + buildOptions.getPortingMode() - + "\n-> source 1.4 mode: " + buildOptions.getSourceOnePointFourMode() - + "\n-> strict spec mode: " + buildOptions.getStrictSpecMode() - + "\n-> lenient spec mode: " + buildOptions.getLenientSpecMode() - + "\n-> use javac mode: " + buildOptions.getUseJavacMode() - + "\n-> preprocess mode: " + buildOptions.getPreprocessMode() - + "\n-> working dir: " + buildOptions.getWorkingOutputPath(); + + "\n-> [ignored-deprecated in AspectJ1.1] porting mode: " + buildOptions.getPortingMode() + + "\n-> [ignored-deprecated in AspectJ1.1] source 1.4 mode: " + buildOptions.getSourceOnePointFourMode() + + "\n-> [ignored-deprecated in AspectJ1.1] strict spec mode: " + buildOptions.getStrictSpecMode() + + "\n-> [ignored-deprecated in AspectJ1.1] lenient spec mode: " + buildOptions.getLenientSpecMode() + + "\n-> [ignored-deprecated in AspectJ1.1] use javac mode: " + buildOptions.getUseJavacMode() + + "\n-> [ignored-deprecated in AspectJ1.1] preprocess mode: " + buildOptions.getPreprocessMode() + + "\n-> [ignored-deprecated in AspectJ1.1] working dir: " + buildOptions.getWorkingOutputPath(); + } + + private String formatSet( Set options ) { + if ( options == null ) return ""; + if ( options.isEmpty() ) return "none"; + + StringBuffer formattedOptions = new StringBuffer(); + Iterator it = options.iterator(); + while (it.hasNext()) { + String o = it.next().toString(); + if (formattedOptions.length() > 0) formattedOptions.append(", "); + formattedOptions.append( o ); + } + return formattedOptions.toString(); + } + + private String formatOptionalString( String s ) { + if ( s == null ) { return "" ; } + else { return s; } } } diff --git a/ajde/src/org/aspectj/ajde/internal/CompilerAdapter.java b/ajde/src/org/aspectj/ajde/internal/CompilerAdapter.java index 19ede47fd..9279456a7 100644 --- a/ajde/src/org/aspectj/ajde/internal/CompilerAdapter.java +++ b/ajde/src/org/aspectj/ajde/internal/CompilerAdapter.java @@ -7,7 +7,9 @@ * http://www.eclipse.org/legal/cpl-v10.html * * Contributors: - * Xerox/PARC initial implementation + * Xerox/PARC initial implementation + * AMC 01.20.2003 extended to support new AspectJ 1.1 options, + * bugzilla #29769 * ******************************************************************/ @@ -17,10 +19,12 @@ import java.io.File; import java.util.*; import org.aspectj.ajde.*; +import org.aspectj.ajdt.ajc.BuildArgParser; import org.aspectj.ajdt.internal.core.builder.AjBuildConfig; import org.aspectj.ajdt.internal.core.builder.AjBuildManager; import org.aspectj.bridge.*; import org.aspectj.util.ConfigParser; +import org.aspectj.util.LangUtil; import org.eclipse.core.runtime.OperationCanceledException; import org.eclipse.jdt.internal.compiler.impl.CompilerOptions; @@ -99,36 +103,263 @@ public class CompilerAdapter { buildConfig.setConfigFile(config); } + // AMC refactored into two methods to populate buildConfig from buildOptions and + // project properties - bugzilla 29769. + configureBuildOptions(buildConfig, Ajde.getDefault().getBuildManager().getBuildOptions()); + configureProjectOptions(buildConfig, Ajde.getDefault().getProjectProperties()); + + buildConfig.setGenerateModelMode(true); + return buildConfig; + } + + /** + * Populate options in a build configuration, using the Ajde BuildOptionsAdapter. + * Added by AMC 01.20.2003, bugzilla #29769 + */ + private void configureBuildOptions( AjBuildConfig config, BuildOptionsAdapter options ) { + + Map javaOptions = config.getJavaOptions(); + + if (options.getSourceOnePointFourMode()) { + javaOptions.put(CompilerOptions.OPTION_Compliance, CompilerOptions.VERSION_1_4); + javaOptions.put(CompilerOptions.OPTION_Source, CompilerOptions.VERSION_1_4); + } + + String enc = options.getCharacterEncoding(); + if ( enc != null & (enc.length() > 0)) { + javaOptions.put(CompilerOptions.OPTION_Encoding, enc ); + } + + String compliance = options.getComplianceLevel(); + if ( compliance != null && (compliance.length() > 0) ) { + String version = CompilerOptions.VERSION_1_4; + if ( compliance.equals( BuildOptionsAdapter.VERSION_13 ) ) { + version = CompilerOptions.VERSION_1_3; + } + javaOptions.put(CompilerOptions.OPTION_Compliance, version ); + javaOptions.put(CompilerOptions.OPTION_Source, version ); + } + + String sourceLevel = options.getSourceCompatibilityLevel(); + if ( null != sourceLevel && ( sourceLevel.length() > 0 )) { + String slVersion = CompilerOptions.VERSION_1_4; + if ( sourceLevel.equals( BuildOptionsAdapter.VERSION_13 ) ) { + slVersion = CompilerOptions.VERSION_1_3; + } + // never set a lower source level than compliance level + String setCompliance = (String) javaOptions.get( CompilerOptions.OPTION_Compliance); + if ( ! (setCompliance.equals( CompilerOptions.VERSION_1_4 ) + && slVersion.equals(CompilerOptions.VERSION_1_3)) ) { + javaOptions.put(CompilerOptions.OPTION_Source, slVersion); + } + } + + Set warnings = options.getWarnings(); + if ( warnings != null ) { + // turn off all warnings + disableWarnings( javaOptions ); + // then selectively enable those in the set + enableWarnings( javaOptions, warnings ); + } + + Set debugOptions = options.getDebugLevel(); + if ( debugOptions != null ) { + // default is all options off, so just need to selectively + // enable + Iterator it = debugOptions.iterator(); + while (it.hasNext()){ + String debug = (String) it.next(); + if ( debug.equals( BuildOptionsAdapter.DEBUG_ALL )) { + javaOptions.put( CompilerOptions.OPTION_LineNumberAttribute, + CompilerOptions.GENERATE); + javaOptions.put( CompilerOptions.OPTION_SourceFileAttribute, + CompilerOptions.GENERATE); + javaOptions.put( CompilerOptions.OPTION_LocalVariableAttribute, + CompilerOptions.GENERATE); + } else if ( debug.equals( BuildOptionsAdapter.DEBUG_LINES )) { + javaOptions.put( CompilerOptions.OPTION_LineNumberAttribute, + CompilerOptions.GENERATE); + } else if ( debug.equals( BuildOptionsAdapter.DEBUG_SOURCE )) { + javaOptions.put( CompilerOptions.OPTION_SourceFileAttribute, + CompilerOptions.GENERATE); + } else if ( debug.equals( BuildOptionsAdapter.DEBUG_VARS)) { + javaOptions.put( CompilerOptions.OPTION_LocalVariableAttribute, + CompilerOptions.GENERATE); + } + } + } + + if ( options.getNoImportError() ) { + javaOptions.put( CompilerOptions.OPTION_ReportInvalidImport, + CompilerOptions.WARNING); + } + + if ( options.getPreserveAllLocals() ) { + javaOptions.put( CompilerOptions.OPTION_PreserveUnusedLocal, + CompilerOptions.PRESERVE); + } + + config.setJavaOptions( javaOptions ); + + configureNonStandardOptions( config, options ); + } + + /** + * Helper method for configureBuildOptions + */ + private void disableWarnings( Map options ) { + options.put( + CompilerOptions.OPTION_ReportOverridingPackageDefaultMethod, + CompilerOptions.IGNORE); + options.put( + CompilerOptions.OPTION_ReportMethodWithConstructorName, + CompilerOptions.IGNORE); + options.put( + CompilerOptions.OPTION_ReportDeprecation, + CompilerOptions.IGNORE); + options.put( + CompilerOptions.OPTION_ReportHiddenCatchBlock, + CompilerOptions.IGNORE); + options.put( + CompilerOptions.OPTION_ReportUnusedLocal, + CompilerOptions.IGNORE); + options.put( + CompilerOptions.OPTION_ReportUnusedParameter, + CompilerOptions.IGNORE); + options.put( + CompilerOptions.OPTION_ReportSyntheticAccessEmulation, + CompilerOptions.IGNORE); + options.put( + CompilerOptions.OPTION_ReportNonExternalizedStringLiteral, + CompilerOptions.IGNORE); + options.put( + CompilerOptions.OPTION_ReportAssertIdentifier, + CompilerOptions.IGNORE); + options.put( + CompilerOptions.OPTION_ReportUnusedImport, + CompilerOptions.IGNORE); + } + + /** + * Helper method for configureBuildOptions + */ + private void enableWarnings( Map options, Set warnings ) { + Iterator it = warnings.iterator(); + while (it.hasNext() ) { + String thisWarning = (String) it.next(); + if ( thisWarning.equals( BuildOptionsAdapter.WARN_ASSERT_IDENITIFIER )) { + options.put( CompilerOptions.OPTION_ReportAssertIdentifier, + CompilerOptions.WARNING ); + } else if ( thisWarning.equals( BuildOptionsAdapter.WARN_CONSTRUCTOR_NAME )) { + options.put( CompilerOptions.OPTION_ReportMethodWithConstructorName, + CompilerOptions.WARNING ); + } else if ( thisWarning.equals( BuildOptionsAdapter.WARN_DEPRECATION )) { + options.put( CompilerOptions.OPTION_ReportDeprecation, + CompilerOptions.WARNING ); + } else if ( thisWarning.equals( BuildOptionsAdapter.WARN_MASKED_CATCH_BLOCKS )) { + options.put( CompilerOptions.OPTION_ReportHiddenCatchBlock, + CompilerOptions.WARNING ); + } else if ( thisWarning.equals( BuildOptionsAdapter.WARN_PACKAGE_DEFAULT_METHOD )) { + options.put( CompilerOptions.OPTION_ReportOverridingPackageDefaultMethod, + CompilerOptions.WARNING ); + } else if ( thisWarning.equals( BuildOptionsAdapter.WARN_SYNTHETIC_ACCESS )) { + options.put( CompilerOptions.OPTION_ReportSyntheticAccessEmulation, + CompilerOptions.WARNING ); + } else if ( thisWarning.equals( BuildOptionsAdapter.WARN_UNUSED_ARGUMENTS )) { + options.put( CompilerOptions.OPTION_ReportUnusedParameter, + CompilerOptions.WARNING ); + } else if ( thisWarning.equals( BuildOptionsAdapter.WARN_UNUSED_IMPORTS )) { + options.put( CompilerOptions.OPTION_ReportUnusedImport, + CompilerOptions.WARNING ); + } else if ( thisWarning.equals( BuildOptionsAdapter.WARN_UNUSED_LOCALS )) { + options.put( CompilerOptions.OPTION_ReportUnusedLocal, + CompilerOptions.WARNING ); + } else if ( thisWarning.equals( BuildOptionsAdapter.WARN_NLS )) { + options.put( CompilerOptions.OPTION_ReportNonExternalizedStringLiteral, + CompilerOptions.WARNING ); + } + } + } + + + /** + * Helper method for configure build options + */ + private void configureNonStandardOptions( AjBuildConfig config, BuildOptionsAdapter options ) { + String nonStdOptions = options.getNonStandardOptions(); + if ( null == nonStdOptions || (nonStdOptions.length() == 0)) return; + + StringTokenizer tok = new StringTokenizer( nonStdOptions ); + String[] args = new String[ tok.countTokens() ]; + int argCount = 0; + while ( tok.hasMoreTokens() ) { + args[argCount++] = tok.nextToken(); + } + + // set the non-standard options in an alternate build config + // (we don't want to lose the settings we already have) + BuildArgParser argParser = new BuildArgParser(); + AjBuildConfig altConfig = argParser.genBuildConfig( args, messageHandler ); + + // copy the answers across + config.setNoWeave( altConfig.isNoWeave() ); + config.setXnoInline( altConfig.isXnoInline() ); + config.setXserializableAspects( altConfig.isXserializableAspects()); + config.setLintMode( altConfig.getLintMode() ); + config.setLintSpecFile( altConfig.getLintSpecFile() ); + } + /** + * Populate options in a build configuration, using the ProjectPropertiesAdapter. + * Added by AMC 01.20.2003, bugzilla #29769 + */ + private void configureProjectOptions( AjBuildConfig config, ProjectPropertiesAdapter properties ) { + + // set the classpath String classpathString = - Ajde.getDefault().getProjectProperties().getBootClasspath() + properties.getBootClasspath() + File.pathSeparator - + Ajde.getDefault().getProjectProperties().getClasspath(); + + properties.getClasspath(); StringTokenizer st = new StringTokenizer( classpathString, File.pathSeparator ); + List classpath = new ArrayList(); while (st.hasMoreTokens()) classpath.add(st.nextToken()); - buildConfig.setClasspath(classpath); + config.setClasspath(classpath); Ajde.getDefault().logEvent("building with classpath: " + classpath); - if (Ajde.getDefault().getBuildManager().getBuildOptions().getSourceOnePointFourMode()) { - buildConfig.getJavaOptions().put(CompilerOptions.OPTION_Compliance, CompilerOptions.VERSION_1_4); - } + config.setOutputDir( + new File(properties.getOutputPath()) + ); - // XXX problematic restriction, support multiple source roots - List sourceRoots = new ArrayList(); - sourceRoots.add(new File(configFile).getParentFile()); - buildConfig.setSourceRoots(sourceRoots); + // new 1.1 options added by AMC - buildConfig.setOutputDir( - new File(Ajde.getDefault().getProjectProperties().getOutputPath()) - ); + Set roots = properties.getSourceRoots(); + if ( null != roots && !roots.isEmpty() ) { + List sourceRoots = new ArrayList( roots ); + config.setSourceRoots(sourceRoots); + } - buildConfig.setGenerateModelMode(true); + Set jars = properties.getInJars(); + if ( null != jars && !jars.isEmpty() ) { + List inJars = new ArrayList( jars ); + config.setInJars(inJars); + } - return buildConfig; + String outJar = properties.getOutJar(); + if ( null != outJar && (outJar.length() > 0) ) { + config.setOutputJar( new File( outJar ) ); + } + + Set aspects = properties.getAspectPath(); + if ( null != aspects && !aspects.isEmpty() ) { + List aPath = new ArrayList( aspects ); + config.setAspectpath( aPath); + } + + } private void init() { diff --git a/ajde/src/org/aspectj/ajde/ui/internal/AjcBuildOptions.java b/ajde/src/org/aspectj/ajde/ui/internal/AjcBuildOptions.java index 3093d09a0..da53c5c09 100644 --- a/ajde/src/org/aspectj/ajde/ui/internal/AjcBuildOptions.java +++ b/ajde/src/org/aspectj/ajde/ui/internal/AjcBuildOptions.java @@ -9,12 +9,19 @@ * * Contributors: * Xerox/PARC initial implementation + * AMC 01.20.2003 extended to support AspectJ 1.1 options, + * bugzilla #29769 * ******************************************************************/ package org.aspectj.ajde.ui.internal; +import java.util.HashSet; +import java.util.Iterator; +import java.util.Set; +import java.util.StringTokenizer; + import org.aspectj.ajde.*; import org.aspectj.ajde.ui.*; @@ -33,31 +40,46 @@ public class AjcBuildOptions implements BuildOptionsAdapter { private static final String PORTING_MODE = AJC + ".portingMode"; private static final String VERBOSE_MODE = AJC + ".verboseMode"; private static final String NONSTANDARD_OPTIONS = AJC + ".nonStandardOptions"; + // 1.1 constants added by AMC + private static final String COMPLIANCE_LEVEL = AJC + ".complianceLevel"; + private static final String SOURCE_LEVEL = AJC + ".sourceLevel"; + private static final String WARNINGS = AJC + ".warnings"; + private static final String DEBUG_OPTIONS = AJC + ".debugOptions"; + private static final String NO_IMPORT_ERROR = AJC + ".noImportError"; + private static final String PRESERVE_LOCALS = AJC + ".preserveLocals"; + private static final String DEFAULT = "default"; + public AjcBuildOptions(UserPreferencesAdapter userPreferencesAdapter) { this.preferencesAdapter = userPreferencesAdapter; } - + + /** @deprecated */ public boolean getUseJavacMode() { return getBooleanOptionVal(USE_JAVAC_MODE); } + /** @deprecated */ public void setUseJavacMode(boolean value) { setBooleanOptionVal(USE_JAVAC_MODE, value); } + /** @deprecated */ public String getWorkingOutputPath() { return preferencesAdapter.getProjectPreference(WORKING_DIR); } + /** @deprecated */ public void setWorkingDir(String path) { preferencesAdapter.setProjectPreference(WORKING_DIR, path); } + /** @deprecated */ public boolean getPreprocessMode() { return getBooleanOptionVal(PREPROCESS_MODE); } + /** @deprecated */ public void setPreprocessMode(boolean value) { setBooleanOptionVal(PREPROCESS_MODE, value); } @@ -70,34 +92,42 @@ public class AjcBuildOptions implements BuildOptionsAdapter { preferencesAdapter.setProjectPreference(CHARACTER_ENCODING, value); } + /** @deprecated */ public boolean getSourceOnePointFourMode() { return getBooleanOptionVal(SOURCE_ONE_POINT_FOUR_MODE); } + /** @deprecated */ public void setSourceOnePointFourMode(boolean value) { setBooleanOptionVal(SOURCE_ONE_POINT_FOUR_MODE, value); } + /** @deprecated */ public boolean getLenientSpecMode() { return getBooleanOptionVal(LENIENT_MODE); } + /** @deprecated */ public void setLenientSpecMode(boolean value) { setBooleanOptionVal(LENIENT_MODE, value); } + /** @deprecated */ public boolean getStrictSpecMode() { return getBooleanOptionVal(STRICT_MODE); } + /** @deprecated */ public void setStrictSpecMode(boolean value) { setBooleanOptionVal(STRICT_MODE, value); } + /** @deprecated */ public boolean getPortingMode() { return getBooleanOptionVal(PORTING_MODE); } + /** @deprecated */ public void setPortingMode(boolean value) { setBooleanOptionVal(PORTING_MODE, value); } @@ -117,6 +147,89 @@ public class AjcBuildOptions implements BuildOptionsAdapter { public void setNonStandardOptions(String value) { preferencesAdapter.setProjectPreference(NONSTANDARD_OPTIONS, value); } + + // ------------- + // new 1.1 compiler options start here... + + /** + * JDK Compliance level to be used by the compiler, either + * VERSION_13 or VERSION_14. + * From -1.3 / -1.4 + */ + public String getComplianceLevel() { + return preferencesAdapter.getProjectPreference(COMPLIANCE_LEVEL); + } + + public void setComplianceLevel( String value ) { + preferencesAdapter.setProjectPreference(COMPLIANCE_LEVEL,value); + } + + /** + * Source compatibility level, either VERSION_13 or VERSION_14. + * From -source (eclipse option) + */ + public String getSourceCompatibilityLevel() { + return preferencesAdapter.getProjectPreference(SOURCE_LEVEL); + } + + public void setSourceCompatibilityLevel(String value) { + preferencesAdapter.setProjectPreference(SOURCE_LEVEL, value); + } + + /** + * Optional warnings, empty List is equivalent to -warn:none, + * returning null uses eclipse compiler default settings + * From -warn:xxx,yyy + */ + public Set getWarnings() { + String warnings = preferencesAdapter.getProjectPreference(WARNINGS); + return toWarningSet( warnings ); + } + + public void setWarnings( Set warningSet ) { + String warnings = fromWarningSet( warningSet ); + preferencesAdapter.setProjectPreference(WARNINGS, warnings); + } + + /** + * Debug level. DEBUG_ALL == {SOURCE, LINES, VARS}. + * Empty list is equivalent to -g:none, returning + * non uses eclipse compiler default settings + * From -g:xxx + */ + public Set getDebugLevel() { + String debug = preferencesAdapter.getProjectPreference(DEBUG_OPTIONS); + return toDebugSet( debug ); + } + + public void setDebugLevel( Set debugSet ) { + String debug = fromDebugSet( debugSet ); + preferencesAdapter.setProjectPreference(DEBUG_OPTIONS, debug); + } + + /** + * No errors generated for unresolved imports + * From -noImportError + */ + public boolean getNoImportError() { + return getBooleanOptionVal(NO_IMPORT_ERROR); + } + + public void setNoImportError(boolean value) { + setBooleanOptionVal(NO_IMPORT_ERROR, value); + } + + /** + * Preserve all unused local variables (for debug) + * From -preserveAllLocals + */ + public boolean getPreserveAllLocals() { + return getBooleanOptionVal(PRESERVE_LOCALS); + } + + public void setPreserveAllLocals(boolean value) { + setBooleanOptionVal(PRESERVE_LOCALS, value); + } private boolean getBooleanOptionVal(String name) { if (preferencesAdapter.getProjectPreference(name) != null) { @@ -133,4 +246,56 @@ public class AjcBuildOptions implements BuildOptionsAdapter { preferencesAdapter.setProjectPreference(name, "false"); } } + + private Set toWarningSet( String warnings ) { + if ( null == warnings ) return null; + if ( warnings.equals(DEFAULT) ) return null; + + Set warningSet = new HashSet(); + StringTokenizer tok = new StringTokenizer( warnings, "," ); + while ( tok.hasMoreTokens() ) { + String warning = tok.nextToken(); + warningSet.add( warning ); + } + return warningSet; + } + + private String fromWarningSet( Set warningSet ) { + if ( warningSet == null ) return DEFAULT; + + StringBuffer warnings = new StringBuffer(); + Iterator it = warningSet.iterator(); + while ( it.hasNext() ) { + String w = (String) it.next(); + if (warnings.length() > 0 ) warnings.append(','); + warnings.append( w ); + } + return warnings.toString(); + } + + private Set toDebugSet( String debugOptions ) { + if ( null == debugOptions ) return null; + if ( debugOptions.equals(DEFAULT) ) return null; + + Set debugSet = new HashSet(); + StringTokenizer tok = new StringTokenizer( debugOptions, "," ); + while ( tok.hasMoreTokens() ) { + String debug = tok.nextToken(); + debugSet.add( debug ); + } + return debugSet; } + + private String fromDebugSet( Set debugSet ) { + if ( debugSet == null ) return DEFAULT; + + StringBuffer debugOptions = new StringBuffer(); + Iterator it = debugSet.iterator(); + while ( it.hasNext() ) { + String d = (String) it.next(); + if (debugOptions.length() > 0 ) debugOptions.append(','); + debugOptions.append( d ); + } + return debugOptions.toString(); + } + } diff --git a/ajde/testdata/examples/figures-coverage/figures/Figure.java b/ajde/testdata/examples/figures-coverage/figures/Figure.java index 9bf5e0f8b..e7f5da0c8 100644 --- a/ajde/testdata/examples/figures-coverage/figures/Figure.java +++ b/ajde/testdata/examples/figures-coverage/figures/Figure.java @@ -1,7 +1,7 @@ package figures; -//import figures.primitives.planar.Point; +import figures.primitives.planar.Point; import java.awt.Canvas; @@ -73,7 +73,9 @@ aspect Figure { declare parents: Point implements java.util.Observable; - declare soft: Point: call(* *(..)); + // AMC - this next line doesn't make sense!! Can these tests ever + // have been run??? + //declare soft: Point: call(* *(..)); } aspect Checks { diff --git a/ajde/testsrc/org/aspectj/ajde/AjdeTests.java b/ajde/testsrc/org/aspectj/ajde/AjdeTests.java index d2cd8fe9f..4a0140e90 100644 --- a/ajde/testsrc/org/aspectj/ajde/AjdeTests.java +++ b/ajde/testsrc/org/aspectj/ajde/AjdeTests.java @@ -22,6 +22,7 @@ public class AjdeTests extends TestCase { TestSuite suite = new TestSuite(AjdeTests.class.getName()); //$JUnit-BEGIN$ suite.addTestSuite(BuildOptionsTest.class); + suite.addTestSuite(BuildConfigurationTests.class); suite.addTestSuite(StructureModelRegressionTest.class); suite.addTestSuite(StructureModelTest.class); suite.addTestSuite(VersionTest.class); diff --git a/ajde/testsrc/org/aspectj/ajde/BuildConfigurationTests.java b/ajde/testsrc/org/aspectj/ajde/BuildConfigurationTests.java new file mode 100644 index 000000000..a59320966 --- /dev/null +++ b/ajde/testsrc/org/aspectj/ajde/BuildConfigurationTests.java @@ -0,0 +1,506 @@ +/********************************************************************** +Copyright (c) 2003 IBM Corporation and others. +All rights reserved. This program and the accompanying materials +are made available under the terms of the Common Public License v1.0 +which accompanies this distribution, and is available at +http://www.eclipse.org/legal/cpl-v10.html +Contributors: +Adrian Colyer - initial version +... +**********************************************************************/ +package org.aspectj.ajde; + +import java.io.File; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import javax.swing.JFrame; + +import junit.framework.TestSuite; + +import org.aspectj.ajde.internal.CompilerAdapter; +import org.aspectj.ajde.ui.IdeUIAdapter; +import org.aspectj.ajde.ui.UserPreferencesAdapter; +import org.aspectj.ajde.ui.internal.AjcBuildOptions; +import org.aspectj.ajde.ui.internal.UserPreferencesStore; +import org.aspectj.ajde.ui.swing.AjdeUIManager; +import org.aspectj.ajde.ui.swing.BasicEditor; +import org.aspectj.ajde.ui.swing.IconRegistry; +import org.aspectj.ajdt.internal.core.builder.AjBuildConfig; +import org.eclipse.jdt.internal.compiler.impl.CompilerOptions; + +/** + * Tests that a correctly populated AjBuildConfig object is created + * in reponse to the setting in BuildOptionsAdapter and + * ProjectPropretiesAdapter + */ +public class BuildConfigurationTests extends AjdeTestCase { + + private CompilerAdapter compilerAdapter; + private AjBuildConfig buildConfig = null; + private AjcBuildOptions buildOptions = null; + private UserPreferencesAdapter preferencesAdapter = null; + private NullIdeProperties projectProperties = null; + private static final String configFile = + "testdata/examples/figures-coverage/all.lst"; + + + public BuildConfigurationTests( String name ) { + super( name ); + } + + public static void main(String[] args) { + junit.swingui.TestRunner.run(BuildConfigurationTests.class); + } + + public static TestSuite suite() { + TestSuite result = new TestSuite(); + result.addTestSuite(BuildConfigurationTests.class); + return result; + } + + + // The tests... + public void testCharacterEncoding() { + buildOptions.setCharacterEncoding( "12345" ); + buildConfig = compilerAdapter.genBuildConfig( configFile ); + Map options = buildConfig.getJavaOptions(); + String encoding = (String) options.get( CompilerOptions.OPTION_Encoding ); + assertEquals( "character encoding", "12345", encoding ); + } + + public void testComplianceLevel() { + buildOptions.setComplianceLevel( BuildOptionsAdapter.VERSION_14 ); + buildConfig = compilerAdapter.genBuildConfig( configFile ); + Map options = buildConfig.getJavaOptions(); + String compliance = (String) options.get(CompilerOptions.OPTION_Compliance); + String sourceLevel = (String) options.get(CompilerOptions.OPTION_Source); + assertEquals( "compliance level", CompilerOptions.VERSION_1_4, compliance); + assertEquals( "source level", CompilerOptions.VERSION_1_4, sourceLevel ); + } + + public void testSourceCompatibilityLevel() { + buildOptions.setComplianceLevel( BuildOptionsAdapter.VERSION_13); + buildOptions.setSourceCompatibilityLevel( BuildOptionsAdapter.VERSION_14); + buildConfig = compilerAdapter.genBuildConfig( configFile ); + Map options = buildConfig.getJavaOptions(); + String compliance = (String) options.get(CompilerOptions.OPTION_Compliance); + String sourceLevel = (String) options.get(CompilerOptions.OPTION_Source); + assertEquals( "compliance level", CompilerOptions.VERSION_1_3, compliance); + assertEquals( "source level", CompilerOptions.VERSION_1_4, sourceLevel ); + } + + public void testSourceIncompatibilityLevel() { + // this config should "fail" and leave source level at 1.4 + buildOptions.setComplianceLevel( BuildOptionsAdapter.VERSION_14); + buildOptions.setSourceCompatibilityLevel( BuildOptionsAdapter.VERSION_13); + buildConfig = compilerAdapter.genBuildConfig( configFile ); + Map options = buildConfig.getJavaOptions(); + String compliance = (String) options.get(CompilerOptions.OPTION_Compliance); + String sourceLevel = (String) options.get(CompilerOptions.OPTION_Source); + assertEquals( "compliance level", CompilerOptions.VERSION_1_4, compliance); + assertEquals( "source level", CompilerOptions.VERSION_1_4, sourceLevel ); + } + + + public void testNullWarnings() { + buildOptions.setWarnings( null ); + buildConfig = compilerAdapter.genBuildConfig( configFile ); + Map options = buildConfig.getJavaOptions(); + + // this should leave us with the default warnings + assertOptionEquals( "report overriding package default", + options, + CompilerOptions.OPTION_ReportOverridingPackageDefaultMethod, + CompilerOptions.WARNING); + assertOptionEquals( "report method with cons name", + options, + CompilerOptions.OPTION_ReportMethodWithConstructorName, + CompilerOptions.WARNING); + assertOptionEquals( "report deprecation", + options, + CompilerOptions.OPTION_ReportDeprecation, + CompilerOptions.WARNING); + assertOptionEquals( "report hidden catch block", + options, + CompilerOptions.OPTION_ReportHiddenCatchBlock, + CompilerOptions.WARNING); + assertOptionEquals( "report unused local", + options, + CompilerOptions.OPTION_ReportUnusedLocal, + CompilerOptions.IGNORE); + assertOptionEquals( "report unused param", + options, + CompilerOptions.OPTION_ReportUnusedParameter, + CompilerOptions.IGNORE); + assertOptionEquals( "report synthectic access", + options, + CompilerOptions.OPTION_ReportSyntheticAccessEmulation, + CompilerOptions.IGNORE); + assertOptionEquals( "report non-externalized string literal", + options, + CompilerOptions.OPTION_ReportNonExternalizedStringLiteral, + CompilerOptions.IGNORE); + assertOptionEquals( "report assert identifer", + options, + CompilerOptions.OPTION_ReportAssertIdentifier, + CompilerOptions.IGNORE); + } + + public void testEmptyWarnings() { + buildOptions.setWarnings( new HashSet() ); + buildConfig = compilerAdapter.genBuildConfig( configFile ); + Map options = buildConfig.getJavaOptions(); + + // this should leave us with the user specifiable warnings + // turned off + assertOptionEquals( "report overriding package default", + options, + CompilerOptions.OPTION_ReportOverridingPackageDefaultMethod, + CompilerOptions.IGNORE); + assertOptionEquals( "report method with cons name", + options, + CompilerOptions.OPTION_ReportMethodWithConstructorName, + CompilerOptions.IGNORE); + assertOptionEquals( "report deprecation", + options, + CompilerOptions.OPTION_ReportDeprecation, + CompilerOptions.IGNORE); + assertOptionEquals( "report hidden catch block", + options, + CompilerOptions.OPTION_ReportHiddenCatchBlock, + CompilerOptions.IGNORE); + assertOptionEquals( "report unused local", + options, + CompilerOptions.OPTION_ReportUnusedLocal, + CompilerOptions.IGNORE); + assertOptionEquals( "report unused param", + options, + CompilerOptions.OPTION_ReportUnusedParameter, + CompilerOptions.IGNORE); + assertOptionEquals( "report synthectic access", + options, + CompilerOptions.OPTION_ReportSyntheticAccessEmulation, + CompilerOptions.IGNORE); + assertOptionEquals( "report non-externalized string literal", + options, + CompilerOptions.OPTION_ReportNonExternalizedStringLiteral, + CompilerOptions.IGNORE); + assertOptionEquals( "report assert identifer", + options, + CompilerOptions.OPTION_ReportAssertIdentifier, + CompilerOptions.IGNORE); + } + + public void testSetOfWarnings() { + HashSet warnings = new HashSet(); + warnings.add( BuildOptionsAdapter.WARN_ASSERT_IDENITIFIER ); + warnings.add( BuildOptionsAdapter.WARN_CONSTRUCTOR_NAME ); + warnings.add( BuildOptionsAdapter.WARN_DEPRECATION ); + warnings.add( BuildOptionsAdapter.WARN_MASKED_CATCH_BLOCKS ); + warnings.add( BuildOptionsAdapter.WARN_PACKAGE_DEFAULT_METHOD ); + warnings.add( BuildOptionsAdapter.WARN_SYNTHETIC_ACCESS ); + warnings.add( BuildOptionsAdapter.WARN_UNUSED_ARGUMENTS ); + warnings.add( BuildOptionsAdapter.WARN_UNUSED_IMPORTS ); + warnings.add( BuildOptionsAdapter.WARN_UNUSED_LOCALS ); + warnings.add( BuildOptionsAdapter.WARN_NLS ); + + buildOptions.setWarnings( warnings ); + buildConfig = compilerAdapter.genBuildConfig( configFile ); + Map options = buildConfig.getJavaOptions(); + + // this should leave us with all the user specifiable warnings + // turned on + assertOptionEquals( "report overriding package default", + options, + CompilerOptions.OPTION_ReportOverridingPackageDefaultMethod, + CompilerOptions.WARNING); + assertOptionEquals( "report method with cons name", + options, + CompilerOptions.OPTION_ReportMethodWithConstructorName, + CompilerOptions.WARNING); + assertOptionEquals( "report deprecation", + options, + CompilerOptions.OPTION_ReportDeprecation, + CompilerOptions.WARNING); + assertOptionEquals( "report hidden catch block", + options, + CompilerOptions.OPTION_ReportHiddenCatchBlock, + CompilerOptions.WARNING); + assertOptionEquals( "report unused local", + options, + CompilerOptions.OPTION_ReportUnusedLocal, + CompilerOptions.WARNING); + assertOptionEquals( "report unused param", + options, + CompilerOptions.OPTION_ReportUnusedParameter, + CompilerOptions.WARNING); + assertOptionEquals( "report synthectic access", + options, + CompilerOptions.OPTION_ReportSyntheticAccessEmulation, + CompilerOptions.WARNING); + assertOptionEquals( "report non-externalized string literal", + options, + CompilerOptions.OPTION_ReportNonExternalizedStringLiteral, + CompilerOptions.WARNING); + assertOptionEquals( "report assert identifer", + options, + CompilerOptions.OPTION_ReportAssertIdentifier, + CompilerOptions.WARNING); + } + + public void testNoDebugOptions() { + buildOptions.setDebugLevel( null ); + buildConfig = compilerAdapter.genBuildConfig( configFile ); + Map options = buildConfig.getJavaOptions(); + + // this should leave us with the default debug settings + assertOptionEquals( "debug source", + options, + CompilerOptions.OPTION_SourceFileAttribute, + CompilerOptions.DO_NOT_GENERATE); + assertOptionEquals( "debug lines", + options, + CompilerOptions.OPTION_LineNumberAttribute, + CompilerOptions.DO_NOT_GENERATE); + assertOptionEquals( "debug vars", + options, + CompilerOptions.OPTION_LocalVariableAttribute, + CompilerOptions.DO_NOT_GENERATE); + } + + public void testEmptyDebugOptions() { + buildOptions.setDebugLevel( new HashSet() ); + buildConfig = compilerAdapter.genBuildConfig( configFile ); + Map options = buildConfig.getJavaOptions(); + + // this should leave us with the debug off + assertOptionEquals( "debug source", + options, + CompilerOptions.OPTION_SourceFileAttribute, + CompilerOptions.DO_NOT_GENERATE); + assertOptionEquals( "debug lines", + options, + CompilerOptions.OPTION_LineNumberAttribute, + CompilerOptions.DO_NOT_GENERATE); + assertOptionEquals( "debug vars", + options, + CompilerOptions.OPTION_LocalVariableAttribute, + CompilerOptions.DO_NOT_GENERATE); + } + + public void testDebugAll() { + HashSet debugOpts = new HashSet(); + debugOpts.add( BuildOptionsAdapter.DEBUG_ALL ); + buildOptions.setDebugLevel( debugOpts ); + buildConfig = compilerAdapter.genBuildConfig( configFile ); + Map options = buildConfig.getJavaOptions(); + + // this should leave us with all debug on + assertOptionEquals( "debug source", + options, + CompilerOptions.OPTION_SourceFileAttribute, + CompilerOptions.GENERATE); + assertOptionEquals( "debug lines", + options, + CompilerOptions.OPTION_LineNumberAttribute, + CompilerOptions.GENERATE); + assertOptionEquals( "debug vars", + options, + CompilerOptions.OPTION_LocalVariableAttribute, + CompilerOptions.GENERATE); + + } + + public void testDebugSet() { + HashSet debugOpts = new HashSet(); + debugOpts.add( BuildOptionsAdapter.DEBUG_SOURCE ); + debugOpts.add( BuildOptionsAdapter.DEBUG_VARS ); + buildOptions.setDebugLevel( debugOpts ); + buildConfig = compilerAdapter.genBuildConfig( configFile ); + Map options = buildConfig.getJavaOptions(); + + // this should leave us with all debug on + assertOptionEquals( "debug source", + options, + CompilerOptions.OPTION_SourceFileAttribute, + CompilerOptions.GENERATE); + assertOptionEquals( "debug lines", + options, + CompilerOptions.OPTION_LineNumberAttribute, + CompilerOptions.DO_NOT_GENERATE); + assertOptionEquals( "debug vars", + options, + CompilerOptions.OPTION_LocalVariableAttribute, + CompilerOptions.GENERATE); + } + + public void testNoImport() { + buildOptions.setNoImportError( true ); + buildConfig = compilerAdapter.genBuildConfig( configFile ); + Map options = buildConfig.getJavaOptions(); + String noImport = (String) options.get( CompilerOptions.OPTION_ReportInvalidImport ); + assertEquals( "no import", CompilerOptions.WARNING, noImport ); + buildOptions.setNoImportError( false ); + } + + public void testPreserveAllLocals() { + buildOptions.setPreserveAllLocals( true ); + buildConfig = compilerAdapter.genBuildConfig( configFile ); + Map options = buildConfig.getJavaOptions(); + String preserve = (String) options.get( CompilerOptions.OPTION_PreserveUnusedLocal ); + assertEquals( "preserve unused", CompilerOptions.PRESERVE, preserve ); + } + + public void testNonStandardOptions() { + buildOptions.setNonStandardOptions( "-XnoWeave" ); + buildConfig = compilerAdapter.genBuildConfig( configFile ); + assertTrue( "XnoWeave", buildConfig.isNoWeave() ); + buildOptions.setNonStandardOptions( "-XserializableAspects" ); + buildConfig = compilerAdapter.genBuildConfig( configFile ); + assertTrue( "XserializableAspects", buildConfig.isXserializableAspects() ); + buildOptions.setNonStandardOptions( "-XnoInline" ); + buildConfig = compilerAdapter.genBuildConfig( configFile ); + assertTrue( "XnoInline", buildConfig.isXnoInline()); + buildOptions.setNonStandardOptions( "-Xlint" ); + buildConfig = compilerAdapter.genBuildConfig( configFile ); + assertEquals( "Xlint", AjBuildConfig.AJLINT_DEFAULT, + buildConfig.getLintMode()); + buildOptions.setNonStandardOptions( "-Xlint:error" ); + buildConfig = compilerAdapter.genBuildConfig( configFile ); + assertEquals( "Xlint", AjBuildConfig.AJLINT_ERROR, + buildConfig.getLintMode()); + buildOptions.setNonStandardOptions( "-Xlintfile testdata/AspectJBuildManagerTest/lint.properties" ); + buildConfig = compilerAdapter.genBuildConfig( configFile ); + assertEquals( "Xlintfile", new File( "testdata/AspectJBuildManagerTest/lint.properties" ).getAbsolutePath(), + buildConfig.getLintSpecFile().toString()); + // and a few options thrown in at once + buildOptions.setNonStandardOptions( "-Xlint -XnoInline -XserializableAspects" ); + buildConfig = compilerAdapter.genBuildConfig( configFile ); + assertEquals( "Xlint", AjBuildConfig.AJLINT_DEFAULT, + buildConfig.getLintMode()); + assertTrue( "XnoInline", buildConfig.isXnoInline()); + assertTrue( "XserializableAspects", buildConfig.isXserializableAspects() ); + } + + public void testSourceRoots() { + Set roots = new HashSet(); + projectProperties.setSourceRoots( roots ); + buildConfig = compilerAdapter.genBuildConfig( configFile ); + List configRoots = buildConfig.getSourceRoots(); + assertTrue( "no source dirs", configRoots.isEmpty() ); + + File f = new File( "testdata/examples/figures/figures-coverage" ); + roots.add( f ); + buildConfig = compilerAdapter.genBuildConfig( configFile ); + List configRoots2 = buildConfig.getSourceRoots(); + assertTrue( "one source dir", configRoots2.size() == 1 ); + assertTrue( "source dir", configRoots2.contains(f) ); + + + File f2 = new File( "testdata/examples/figures/figures-demo" ); + roots.add( f2 ); + buildConfig = compilerAdapter.genBuildConfig( configFile ); + List configRoots3 = buildConfig.getSourceRoots(); + assertTrue( "two source dirs", configRoots3.size() == 2 ); + assertTrue( "source dir 1", configRoots3.contains(f) ); + assertTrue( "source dir 2", configRoots3.contains(f2) ); + } + + public void testInJars() { + Set jars = new HashSet(); + projectProperties.setInJars( jars ); + buildConfig = compilerAdapter.genBuildConfig( configFile ); + List inJars = buildConfig.getInJars(); + assertTrue( "no in jars", inJars.isEmpty() ); + + File f = new File( "jarone.jar" ); + jars.add( f ); + buildConfig = compilerAdapter.genBuildConfig( configFile ); + List inJars2 = buildConfig.getInJars(); + assertTrue( "one in jar", inJars2.size() == 1 ); + assertTrue( "in jar", inJars2.contains(f) ); + + + File f2 = new File( "jartwo.jar" ); + jars.add( f2 ); + buildConfig = compilerAdapter.genBuildConfig( configFile ); + List inJars3 = buildConfig.getInJars(); + assertTrue( "two in jars", inJars3.size() == 2 ); + assertTrue( "in jar 1", inJars3.contains(f) ); + assertTrue( "in jar 2", inJars3.contains(f2) ); + } + + public void testAspectPath() { + Set aspects = new HashSet(); + projectProperties.setAspectPath( aspects ); + buildConfig = compilerAdapter.genBuildConfig( configFile ); + List aPath = buildConfig.getAspectpath(); + assertTrue( "no aspect path", aPath.isEmpty() ); + + File f = new File( "jarone.jar" ); + aspects.add( f ); + buildConfig = compilerAdapter.genBuildConfig( configFile ); + List aPath2 = buildConfig.getAspectpath(); + assertTrue( "one jar in path", aPath2.size() == 1 ); + assertTrue( "1 aspectpath", aPath2.contains(f) ); + + + File f2 = new File( "jartwo.jar" ); + aspects.add( f2 ); + buildConfig = compilerAdapter.genBuildConfig( configFile ); + List aPath3 = buildConfig.getAspectpath(); + assertTrue( "two jars in path", aPath3.size() == 2 ); + assertTrue( "1 aspectpath", aPath3.contains(f) ); + assertTrue( "2 aspectpath", aPath3.contains(f2) ); + } + + public void testOutJar() { + String outJar = "mybuild.jar"; + projectProperties.setOutJar( outJar ); + buildConfig = compilerAdapter.genBuildConfig( configFile ); + assertEquals( "out jar", outJar, buildConfig.getOutputJar().toString() ); + } + + protected void setUp() throws Exception { + preferencesAdapter = new UserPreferencesStore(); + buildOptions = new AjcBuildOptions(preferencesAdapter); + compilerAdapter = new CompilerAdapter(); + projectProperties = new NullIdeProperties( "" ); + init(); + } + + protected void tearDown() throws Exception { + super.tearDown(); + buildOptions.setCharacterEncoding(""); + } + + public void init() { + try { + Ajde.init( + null, + null, + null, + projectProperties, + buildOptions, + null, + null, + null); + + //Ajde.getDefault().enableLogging( System.out ); + } catch (Throwable t) { + t.printStackTrace(); + Ajde.getDefault().getErrorHandler().handleError( + "Ajde failed to initialize.", + t); + } + } + + private void assertOptionEquals( String reason, Map options, String optionName, String value) { + String mapValue = (String) options.get(optionName); + assertEquals( reason, value, mapValue ); + } + +} diff --git a/ajde/testsrc/org/aspectj/ajde/BuildOptionsTest.java b/ajde/testsrc/org/aspectj/ajde/BuildOptionsTest.java index 5f5df1329..f30b4f308 100644 --- a/ajde/testsrc/org/aspectj/ajde/BuildOptionsTest.java +++ b/ajde/testsrc/org/aspectj/ajde/BuildOptionsTest.java @@ -8,11 +8,16 @@ * * Contributors: * Xerox/PARC initial implementation + * AMC 01.21.2003 extended to cover new AspectJ1.1 options * ******************************************************************/ package org.aspectj.ajde; +import java.util.HashSet; +import java.util.Iterator; +import java.util.Set; + import junit.framework.TestSuite; import org.aspectj.ajde.ui.UserPreferencesAdapter; @@ -47,6 +52,97 @@ public class BuildOptionsTest extends AjdeTestCase { buildOptions.setPortingMode(true); assertTrue("porting mode", buildOptions.getPortingMode()); } + + public void testVerboseMode() { + buildOptions.setVerboseMode(true); + assertTrue("verbose mode", buildOptions.getVerboseMode()); + } + + public void testNonStandardOptions() { + buildOptions.setNonStandardOptions( "-Xlint" ); + assertEquals( "non std options", "-Xlint", + buildOptions.getNonStandardOptions()); + } + + public void testComplianceLevel() { + buildOptions.setComplianceLevel( BuildOptionsAdapter.VERSION_14 ); + assertEquals( "compliance level", + BuildOptionsAdapter.VERSION_14, + buildOptions.getComplianceLevel()); + } + + public void testSourceCompatibilityLevel() { + buildOptions.setSourceCompatibilityLevel(BuildOptionsAdapter.VERSION_13); + assertEquals( "source level", + BuildOptionsAdapter.VERSION_13, + buildOptions.getSourceCompatibilityLevel()); + } + + public void testWarnings() { + buildOptions.setWarnings( null ); + assertNull( "null warning set", buildOptions.getWarnings()); + HashSet s = new HashSet(); + buildOptions.setWarnings( s ); + Set s2 = buildOptions.getWarnings(); + assertTrue( "empty warning set", s2.isEmpty() ); + s.add( BuildOptionsAdapter.WARN_ASSERT_IDENITIFIER ); + s.add( BuildOptionsAdapter.WARN_MASKED_CATCH_BLOCKS ); + buildOptions.setWarnings( s ); + s2 = buildOptions.getWarnings(); + assertTrue( "two warnings", s2.size() == 2 ); + boolean warn_assert_found = false; + boolean warn_catch_found = false; + Iterator it = s2.iterator(); + while (it.hasNext()) { + String option = (String) it.next(); + if ( option.equals( BuildOptionsAdapter.WARN_ASSERT_IDENITIFIER ) ) { + warn_assert_found = true; + } + if ( option.equals( BuildOptionsAdapter.WARN_MASKED_CATCH_BLOCKS ) ) { + warn_catch_found = true; + } + } + assertTrue( "assert warning found", warn_assert_found ); + assertTrue( "catch waning found", warn_catch_found ); + } + + public void testDebugLevel() { + buildOptions.setDebugLevel( null ); + assertNull( "null debug set", buildOptions.getDebugLevel()); + HashSet s = new HashSet(); + buildOptions.setDebugLevel( s ); + Set s2 = buildOptions.getDebugLevel(); + assertTrue( "empty debug set", s2.isEmpty() ); + s.add( BuildOptionsAdapter.DEBUG_LINES ); + s.add( BuildOptionsAdapter.DEBUG_SOURCE ); + buildOptions.setDebugLevel( s ); + s2 = buildOptions.getDebugLevel(); + assertTrue( "two warnings", s2.size() == 2 ); + boolean debug_lines_found = false; + boolean debug_source_found = false; + Iterator it = s2.iterator(); + while (it.hasNext()) { + String option = (String) it.next(); + if ( option.equals( BuildOptionsAdapter.DEBUG_LINES ) ) { + debug_lines_found = true; + } + if ( option.equals( BuildOptionsAdapter.DEBUG_SOURCE ) ) { + debug_source_found = true; + } + } + assertTrue( "debug lines found", debug_lines_found ); + assertTrue( "debug source found", debug_source_found ); + } + + public void testNoImportError() { + buildOptions.setNoImportError(true); + assertTrue("no import error", buildOptions.getNoImportError()); + } + + public void testPreserveLocals() { + buildOptions.setPreserveAllLocals(true); + assertTrue("preserve all locals", buildOptions.getPreserveAllLocals()); + } protected void setUp() throws Exception { super.setUp(); diff --git a/ajde/testsrc/org/aspectj/ajde/NullIdeManager.java b/ajde/testsrc/org/aspectj/ajde/NullIdeManager.java index 2269fcaba..c3a09e8dc 100644 --- a/ajde/testsrc/org/aspectj/ajde/NullIdeManager.java +++ b/ajde/testsrc/org/aspectj/ajde/NullIdeManager.java @@ -44,6 +44,8 @@ public class NullIdeManager { new IconRegistry(), nullFrame, true); + + //Ajde.getDefault().enableLogging( System.out ); } catch (Throwable t) { t.printStackTrace(); Ajde.getDefault().getErrorHandler().handleError( diff --git a/ajde/testsrc/org/aspectj/ajde/NullIdeProperties.java b/ajde/testsrc/org/aspectj/ajde/NullIdeProperties.java index 0369954f8..03173f33b 100644 --- a/ajde/testsrc/org/aspectj/ajde/NullIdeProperties.java +++ b/ajde/testsrc/org/aspectj/ajde/NullIdeProperties.java @@ -8,6 +8,7 @@ * * Contributors: * Xerox/PARC initial implementation + * AMC 01.20.2003 extended to support AspectJ 1.1 options * ******************************************************************/ @@ -24,6 +25,11 @@ public class NullIdeProperties implements ProjectPropertiesAdapter { private String testProjectPath = ""; private List buildConfigFiles = new ArrayList(); + private Set inJars; + private Set sourceRoots; + private Set aspectPath; + private String outJar; + public NullIdeProperties(String testProjectPath) { this.testProjectPath = testProjectPath; } @@ -58,7 +64,10 @@ public class NullIdeProperties implements ProjectPropertiesAdapter { public String getClasspath() { //XXX - return testProjectPath + System.getProperty("sun.boot.class.path") + File.pathSeparator + "../../../runtime/bin"; + // AMC - added in path separator since absence was causing + // build failures with invalid classpath + return testProjectPath + File.pathSeparator + + System.getProperty("sun.boot.class.path") + File.pathSeparator + "../runtime/bin"; } public String getOutputPath() { @@ -84,4 +93,28 @@ public class NullIdeProperties implements ProjectPropertiesAdapter { public String getVmArgs() { return null; } + + public void setInJars( Set jars ) { this.inJars = jars; } + + public Set getInJars( ) { + return inJars; + } + + public void setOutJar( String jar ){ this.outJar = jar; } + + public String getOutJar() { + return outJar; + } + + public void setSourceRoots( Set roots ) { this.sourceRoots = roots; } + + public Set getSourceRoots() { + return sourceRoots; + } + + public void setAspectPath( Set path ) { this.aspectPath = path; } + + public Set getAspectPath() { + return aspectPath; + } } diff --git a/ajde/testsrc/org/aspectj/ajde/StructureModelRegressionTest.java b/ajde/testsrc/org/aspectj/ajde/StructureModelRegressionTest.java index be06bdf20..d3c4b1041 100644 --- a/ajde/testsrc/org/aspectj/ajde/StructureModelRegressionTest.java +++ b/ajde/testsrc/org/aspectj/ajde/StructureModelRegressionTest.java @@ -14,10 +14,12 @@ package org.aspectj.ajde; import java.io.File; +import java.util.List; import junit.framework.TestSuite; import org.aspectj.asm.StructureModel; +import org.aspectj.asm.StructureNode; public class StructureModelRegressionTest extends AjdeTestCase { @@ -36,7 +38,7 @@ public class StructureModelRegressionTest extends AjdeTestCase { } public void test() { - String testLstFile = "StructureModelRegressionTest/example.lst"; + String testLstFile = "testdata/StructureModelRegressionTest/example.lst"; File f = new File(testLstFile); assertTrue(testLstFile, f.canRead()); assertTrue("saved model: " + testLstFile, verifyAgainstSavedModel(testLstFile)); @@ -52,7 +54,14 @@ public class StructureModelRegressionTest extends AjdeTestCase { StructureModel savedModel = Ajde.getDefault().getStructureModelManager().getStructureModel(); //System.err.println( savedModel.getRoot().getClass() + ", " + savedModel.getRoot()); - return savedModel.getRoot().equals(model.getRoot()); + // AMC This test will not pass as written until StructureNode defines + // equals. The equals loic is commented out in the StructureNode + // class - adding it back in could have unforeseen system-wide + // consequences, so I've defined a structureNodesEqual( ) helper + // method here instead. + StructureNode rootNode = model.getRoot(); + StructureNode savedRootNode = savedModel.getRoot(); + return structureNodesEqual( rootNode, savedRootNode ); } else { Ajde.getDefault().getStructureModelManager().writeStructureModel(lstFile); return true; @@ -60,6 +69,30 @@ public class StructureModelRegressionTest extends AjdeTestCase { //return true; } + private boolean structureNodesEqual( StructureNode s1, StructureNode s2 ) { + final boolean equal = true; + if ( s1 == s2 ) return equal; + if ( null == s1 || null == s2 ) return !equal; + + if (!s1.getName( ).equals(s2.getName())) return !equal; + if (!s1.getKind( ).equals(s2.getKind())) return !equal; + + // check child nodes + List s1Kids = s1.getChildren(); + List s2Kids = s2.getChildren(); + + if ( s1Kids != null && s2Kids != null ) { + if (s1Kids == null || s2Kids == null) return !equal; + if (s1Kids.size() != s2Kids.size() ) return !equal; + for ( int k=0; k>>>>> " + currentView.getRootNode().getStructureNode()); + StructureNode n = currentView.getRootNode().getStructureNode(); assertTrue( "no structure", currentView.getRootNode().getStructureNode().getChildren().get(0) diff --git a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/ajc/BuildArgParser.java b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/ajc/BuildArgParser.java index 99c2dc8ac..4df6f257e 100644 --- a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/ajc/BuildArgParser.java +++ b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/ajc/BuildArgParser.java @@ -355,7 +355,9 @@ public class BuildArgParser extends org.eclipse.jdt.internal.compiler.batch.Main } else if (arg.equals("-emacssym")) { buildConfig.setEmacsSymMode(true); buildConfig.setGenerateModelMode(true); - } else if (arg.equals("-noweave")) { + //AMC - added -XnoWeave to options that match, in line with + // AspectJ 1.1 release notes documentation. + } else if (arg.equals("-noweave") || arg.equals( "-XnoWeave")) { buildConfig.setNoWeave(true); } else if (arg.equals("-XserializableAspects")) { buildConfig.setXserializableAspects(true); diff --git a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/core/builder/AjBuildConfig.java b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/core/builder/AjBuildConfig.java index 60089d65c..301fd1bae 100644 --- a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/core/builder/AjBuildConfig.java +++ b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/core/builder/AjBuildConfig.java @@ -8,6 +8,9 @@ * * Contributors: * PARC initial implementation + * Adrian Colyer added constructor to populate javaOptions with + * default settings - 01.20.2003 + * Bugzilla #29768, 29769 * ******************************************************************/ @@ -16,12 +19,14 @@ package org.aspectj.ajdt.internal.core.builder; import java.io.File; import java.util.*; +import org.eclipse.jdt.internal.compiler.impl.CompilerOptions; + /** * All configuration information needed to run the AspectJ compiler. */ public class AjBuildConfig { - public static final String AJLINT_INGORE = "ignore"; + public static final String AJLINT_IGNORE = "ignore"; public static final String AJLINT_WARN = "warn"; public static final String AJLINT_ERROR = "error"; public static final String AJLINT_DEFAULT = "default"; @@ -44,6 +49,72 @@ public class AjBuildConfig { private String lintMode = AJLINT_DEFAULT; private File lintSpecFile = null; + /** + * Intialises the javaOptions Map to hold the default + * JDT Compiler settings. Added by AMC 01.20.2003 in reponse + * to bug #29768 and enh. 29769. + * The settings here are duplicated from those set in + * org.eclipse.jdt.internal.compiler.batch.Main, but I've elected to + * copy them rather than refactor the JDT class since this keeps + * integration with future JDT releases easier (?). + */ + public AjBuildConfig( ) { + javaOptions.put( + CompilerOptions.OPTION_LocalVariableAttribute, + CompilerOptions.DO_NOT_GENERATE); + javaOptions.put( + CompilerOptions.OPTION_LineNumberAttribute, + CompilerOptions.DO_NOT_GENERATE); + javaOptions.put( + CompilerOptions.OPTION_SourceFileAttribute, + CompilerOptions.DO_NOT_GENERATE); + javaOptions.put( + CompilerOptions.OPTION_PreserveUnusedLocal, + CompilerOptions.OPTIMIZE_OUT); + javaOptions.put( + CompilerOptions.OPTION_ReportUnreachableCode, + CompilerOptions.ERROR); + javaOptions.put( + CompilerOptions.OPTION_ReportInvalidImport, + CompilerOptions.ERROR); + javaOptions.put( + CompilerOptions.OPTION_ReportOverridingPackageDefaultMethod, + CompilerOptions.WARNING); + javaOptions.put( + CompilerOptions.OPTION_ReportMethodWithConstructorName, + CompilerOptions.WARNING); + javaOptions.put( + CompilerOptions.OPTION_ReportDeprecation, + CompilerOptions.WARNING); + javaOptions.put( + CompilerOptions.OPTION_ReportHiddenCatchBlock, + CompilerOptions.WARNING); + javaOptions.put( + CompilerOptions.OPTION_ReportUnusedLocal, + CompilerOptions.IGNORE); + javaOptions.put( + CompilerOptions.OPTION_ReportUnusedParameter, + CompilerOptions.IGNORE); + javaOptions.put( + CompilerOptions.OPTION_ReportSyntheticAccessEmulation, + CompilerOptions.IGNORE); + javaOptions.put( + CompilerOptions.OPTION_ReportNonExternalizedStringLiteral, + CompilerOptions.IGNORE); + javaOptions.put( + CompilerOptions.OPTION_ReportAssertIdentifier, + CompilerOptions.IGNORE); + javaOptions.put( + CompilerOptions.OPTION_Compliance, + CompilerOptions.VERSION_1_3); + javaOptions.put( + CompilerOptions.OPTION_Source, + CompilerOptions.VERSION_1_3); + javaOptions.put( + CompilerOptions.OPTION_TargetPlatform, + CompilerOptions.VERSION_1_1); + } + /** * returned files includes
    *
  • files explicitly listed on command-line
  • diff --git a/org.aspectj.ajdt.core/testsrc/org/aspectj/ajdt/ajc/BuildArgParserTestCase.java b/org.aspectj.ajdt.core/testsrc/org/aspectj/ajdt/ajc/BuildArgParserTestCase.java index badb55691..c9e8f7152 100644 --- a/org.aspectj.ajdt.core/testsrc/org/aspectj/ajdt/ajc/BuildArgParserTestCase.java +++ b/org.aspectj.ajdt.core/testsrc/org/aspectj/ajdt/ajc/BuildArgParserTestCase.java @@ -335,7 +335,7 @@ public class BuildArgParserTestCase extends TestCase { config = parser.genBuildConfig(new String[] {"-Xlint:error"}, messageWriter); assertTrue("", config.getLintMode().equals(AjBuildConfig.AJLINT_ERROR)); config = parser.genBuildConfig(new String[] {"-Xlint:ignore"}, messageWriter); - assertTrue("", config.getLintMode().equals(AjBuildConfig.AJLINT_INGORE)); + assertTrue("", config.getLintMode().equals(AjBuildConfig.AJLINT_IGNORE)); } public void testXlintfile() throws InvalidInputException { -- 2.39.5