A comprehensive Java parsing library providing complete support for parsing Java source code from Java 1.0 through Java 21 with advanced analysis functionalities.
—
JavaParser provides comprehensive configuration options to control parsing behavior, language level support, symbol resolution, and various parsing features. The ParserConfiguration class centralizes all configuration settings.
Configure core parsing behavior and language support.
/**
* Configuration class for controlling parser behavior
*/
public class ParserConfiguration {
/**
* Create configuration with default settings
*/
public ParserConfiguration();
/**
* Set Java language level to support
* @param languageLevel Target Java version
* @return This configuration for chaining
*/
public ParserConfiguration setLanguageLevel(LanguageLevel languageLevel);
/**
* Get current language level
* @return Current language level setting
*/
public LanguageLevel getLanguageLevel();
/**
* Set character encoding for source files
* @param characterEncoding Character encoding (e.g., UTF-8)
* @return This configuration for chaining
*/
public ParserConfiguration setCharacterEncoding(Charset characterEncoding);
/**
* Get current character encoding
* @return Current character encoding
*/
public Charset getCharacterEncoding();
/**
* Enable/disable token storage for position tracking
* @param storeTokens true to store tokens
* @return This configuration for chaining
*/
public ParserConfiguration setStoreTokens(boolean storeTokens);
/**
* Check if token storage is enabled
* @return true if tokens are stored
*/
public boolean isStoreTokens();
/**
* Set tab width for position calculations
* @param tabWidth Number of spaces per tab
* @return This configuration for chaining
*/
public ParserConfiguration setTabWidth(int tabWidth);
/**
* Get tab width setting
* @return Current tab width
*/
public int getTabWidth();
}
/**
* Java language level enumeration
*/
public enum LanguageLevel {
/** Java 1.0 support */
JAVA_1_0,
/** Java 1.1 support */
JAVA_1_1,
/** Java 1.2 support */
JAVA_1_2,
/** Java 1.3 support */
JAVA_1_3,
/** Java 1.4 support */
JAVA_1_4,
/** Java 5 support (generics, annotations, autoboxing) */
JAVA_5,
/** Java 6 support */
JAVA_6,
/** Java 7 support (diamond operator, try-with-resources) */
JAVA_7,
/** Java 8 support (lambdas, method references, streams) */
JAVA_8,
/** Java 9 support (modules, private interface methods) */
JAVA_9,
/** Java 10 support (var keyword) */
JAVA_10,
/** Java 11 support (var in lambda parameters) */
JAVA_11,
/** Java 12 support (switch expressions preview) */
JAVA_12,
/** Java 13 support (text blocks preview) */
JAVA_13,
/** Java 14 support (switch expressions, records preview) */
JAVA_14,
/** Java 15 support (text blocks, sealed classes preview) */
JAVA_15,
/** Java 16 support (records, pattern matching instanceof) */
JAVA_16,
/** Java 17 support (sealed classes, switch pattern matching) */
JAVA_17,
/** Java 18 support */
JAVA_18,
/** Java 19 support */
JAVA_19,
/** Java 20 support */
JAVA_20,
/** Java 21 support (virtual threads, pattern matching) */
JAVA_21,
/** Current/latest supported version */
CURRENT
}Usage Examples:
import com.github.javaparser.ParserConfiguration;
import com.github.javaparser.ParserConfiguration.LanguageLevel;
import java.nio.charset.StandardCharsets;
// Configure for Java 17 with UTF-8 encoding
ParserConfiguration config = new ParserConfiguration()
.setLanguageLevel(LanguageLevel.JAVA_17)
.setCharacterEncoding(StandardCharsets.UTF_8)
.setStoreTokens(true) // Enable position tracking
.setTabWidth(4); // 4 spaces per tab
// Use configuration with parser
JavaParser parser = new JavaParser(config);
// Parse with specific language level
ParseResult<CompilationUnit> result = parser.parse(modernJavaCode);
// Different configurations for different purposes
ParserConfiguration legacyConfig = new ParserConfiguration()
.setLanguageLevel(LanguageLevel.JAVA_8); // For older codebases
ParserConfiguration modernConfig = new ParserConfiguration()
.setLanguageLevel(LanguageLevel.JAVA_21) // Latest features
.setStoreTokens(true); // For IDE-like featuresConfigure advanced symbol resolution and type analysis capabilities.
/**
* Set symbol resolver for type analysis
* @param symbolResolver Symbol resolver implementation
* @return This configuration for chaining
*/
public ParserConfiguration setSymbolResolver(SymbolResolver symbolResolver);
/**
* Get current symbol resolver
* @return Current symbol resolver or null if not set
*/
public Optional<SymbolResolver> getSymbolResolver();
/**
* Check if symbol resolution is enabled
* @return true if symbol resolver is configured
*/
public boolean isSymbolResolutionEnabled();Usage Examples:
import com.github.javaparser.symbolsolver.JavaSymbolSolver;
import com.github.javaparser.symbolsolver.resolution.typesolvers.CombinedTypeSolver;
import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver;
import com.github.javaparser.symbolsolver.resolution.typesolvers.JavaParserTypeSolver;
// Set up symbol resolution
CombinedTypeSolver typeSolver = new CombinedTypeSolver();
typeSolver.add(new ReflectionTypeSolver()); // JDK classes
typeSolver.add(new JavaParserTypeSolver(new File("src/main/java"))); // Project sources
JavaSymbolSolver symbolResolver = new JavaSymbolSolver(typeSolver);
// Configure parser with symbol resolution
ParserConfiguration config = new ParserConfiguration()
.setLanguageLevel(LanguageLevel.JAVA_17)
.setSymbolResolver(symbolResolver);
JavaParser parser = new JavaParser(config);
// Now parsing enables type resolution
CompilationUnit cu = parser.parse(code).getResult().get();
// Resolve types and symbols
for (NameExpr nameExpr : cu.findAll(NameExpr.class)) {
try {
ResolvedValueDeclaration resolved = nameExpr.resolve();
System.out.println("Symbol: " + resolved.getName() + " -> " + resolved.getType());
} catch (UnsolvedSymbolException e) {
System.out.println("Could not resolve: " + nameExpr.getNameAsString());
}
}Configure validation behavior and error handling strategies.
/**
* Set validators for additional syntax and semantic checks
* @param validators List of validators to apply
* @return This configuration for chaining
*/
public ParserConfiguration setValidators(List<Validator> validators);
/**
* Get current validators
* @return List of configured validators
*/
public List<Validator> getValidators();
/**
* Add a validator to the configuration
* @param validator Validator to add
* @return This configuration for chaining
*/
public ParserConfiguration addValidator(Validator validator);
/**
* Set problem reporter for handling parse problems
* @param problemReporter Problem reporter implementation
* @return This configuration for chaining
*/
public ParserConfiguration setProblemReporter(ProblemReporter problemReporter);
/**
* Get current problem reporter
* @return Current problem reporter
*/
public ProblemReporter getProblemReporter();Usage Examples:
import com.github.javaparser.ast.validator.*;
// Configure validation for specific Java version
ParserConfiguration config = new ParserConfiguration()
.setLanguageLevel(LanguageLevel.JAVA_8);
// Add custom validators
config.addValidator(new ReservedKeywordValidator())
.addValidator(new Java8Validator());
// Custom problem reporter
config.setProblemReporter(new ProblemReporter() {
@Override
public void report(Problem problem) {
System.err.println("Parse issue: " + problem.getMessage());
if (problem.getLocation().isPresent()) {
TokenRange location = problem.getLocation().get();
System.err.println("At: " + location.getBegin());
}
}
});
JavaParser parser = new JavaParser(config);Configure preprocessing options for source code transformation before parsing.
/**
* Set preprocessing providers for source transformation
* @param providers Preprocessing providers
* @return This configuration for chaining
*/
public ParserConfiguration setPreprocessors(List<Processor> providers);
/**
* Add preprocessing provider
* @param processor Processor to add
* @return This configuration for chaining
*/
public ParserConfiguration addProcessor(Processor processor);
/**
* Set line ending processing provider
* @param provider Line ending processor
* @return This configuration for chaining
*/
public ParserConfiguration setLineEndingProcessingProvider(LineEndingProcessingProvider provider);
/**
* Set unicode escape processing provider
* @param provider Unicode escape processor
* @return This configuration for chaining
*/
public ParserConfiguration setUnicodeEscapeProcessingProvider(UnicodeEscapeProcessingProvider provider);Usage Examples:
// Configure line ending normalization
config.setLineEndingProcessingProvider(
LineEndingProcessingProvider.NORMALIZE_TO_LF);
// Configure unicode escape processing
config.setUnicodeEscapeProcessingProvider(
UnicodeEscapeProcessingProvider.PROCESS_ESCAPES);
// Add custom preprocessor
config.addProcessor(new Processor() {
@Override
public String process(String code) {
// Custom preprocessing logic
return code.replace("//FIXME", "//TODO");
}
});Configure parser performance and memory usage options.
/**
* Set whether to store original tokens for position tracking
* @param storeTokens true to store tokens (uses more memory)
* @return This configuration for chaining
*/
public ParserConfiguration setStoreTokens(boolean storeTokens);
/**
* Set whether to perform expensive validation checks
* @param performExpensiveChecks true to enable extensive validation
* @return This configuration for chaining
*/
public ParserConfiguration setPerformExpensiveChecks(boolean performExpensiveChecks);
/**
* Set whether to cache parsing results
* @param cacheParsingResults true to enable caching
* @return This configuration for chaining
*/
public ParserConfiguration setCacheParsingResults(boolean cacheParsingResults);
/**
* Set maximum parsing depth to prevent stack overflow
* @param maxParsingDepth Maximum recursion depth
* @return This configuration for chaining
*/
public ParserConfiguration setMaxParsingDepth(int maxParsingDepth);Usage Examples:
// Performance-optimized configuration
ParserConfiguration fastConfig = new ParserConfiguration()
.setStoreTokens(false) // Save memory
.setPerformExpensiveChecks(false) // Skip expensive validation
.setCacheParsingResults(true) // Enable caching
.setMaxParsingDepth(1000); // Prevent deep recursion
// Memory-optimized configuration
ParserConfiguration memoryConfig = new ParserConfiguration()
.setStoreTokens(false) // Don't store tokens
.setCacheParsingResults(false); // Don't cache results
// Full-featured configuration (more memory usage)
ParserConfiguration fullConfig = new ParserConfiguration()
.setStoreTokens(true) // Store for position tracking
.setPerformExpensiveChecks(true) // Full validation
.setSymbolResolver(symbolResolver); // Enable type resolutionCommon configuration presets for typical use cases.
/**
* Utility methods for common configuration patterns
*/
public class ParserConfigurationPresets {
/**
* Configuration optimized for IDE features
* @return Configuration with full position tracking and symbol resolution
*/
public static ParserConfiguration ideConfiguration() {
return new ParserConfiguration()
.setLanguageLevel(LanguageLevel.CURRENT)
.setStoreTokens(true)
.setPerformExpensiveChecks(true);
}
/**
* Configuration optimized for batch processing
* @return Lightweight configuration for processing many files
*/
public static ParserConfiguration batchProcessingConfiguration() {
return new ParserConfiguration()
.setStoreTokens(false)
.setPerformExpensiveChecks(false)
.setCacheParsingResults(true);
}
/**
* Configuration for legacy Java code
* @return Configuration for older Java versions
*/
public static ParserConfiguration legacyConfiguration() {
return new ParserConfiguration()
.setLanguageLevel(LanguageLevel.JAVA_8);
}
/**
* Configuration for modern Java features
* @return Configuration supporting latest Java features
*/
public static ParserConfiguration modernConfiguration() {
return new ParserConfiguration()
.setLanguageLevel(LanguageLevel.JAVA_21);
}
}Usage Examples:
// Use preset configurations
JavaParser ideParser = new JavaParser(ParserConfigurationPresets.ideConfiguration());
JavaParser batchParser = new JavaParser(ParserConfigurationPresets.batchProcessingConfiguration());
JavaParser legacyParser = new JavaParser(ParserConfigurationPresets.legacyConfiguration());
// Customize preset
ParserConfiguration customConfig = ParserConfigurationPresets.modernConfiguration()
.setCharacterEncoding(StandardCharsets.UTF_8)
.setSymbolResolver(mySymbolResolver);Fluent builder pattern for complex configuration setup.
/**
* Fluent configuration builder
*/
public class ParserConfigurationBuilder {
/**
* Start building configuration
* @return New builder instance
*/
public static ParserConfigurationBuilder builder() {
return new ParserConfigurationBuilder();
}
/**
* Set language level
* @param level Java language level
* @return This builder for chaining
*/
public ParserConfigurationBuilder languageLevel(LanguageLevel level) {
// Implementation
return this;
}
/**
* Enable symbol resolution with type solver
* @param typeSolver Type solver to use
* @return This builder for chaining
*/
public ParserConfigurationBuilder symbolResolution(TypeSolver typeSolver) {
// Implementation
return this;
}
/**
* Build final configuration
* @return Configured ParserConfiguration
*/
public ParserConfiguration build() {
// Implementation
return new ParserConfiguration();
}
}Usage Examples:
// Complex configuration with builder
ParserConfiguration config = ParserConfigurationBuilder.builder()
.languageLevel(LanguageLevel.JAVA_17)
.symbolResolution(typeSolver)
.encoding(StandardCharsets.UTF_8)
.storeTokens(true)
.validators(Arrays.asList(
new ReservedKeywordValidator(),
new Java17Validator()
))
.problemReporter(customReporter)
.build();
JavaParser parser = new JavaParser(config);/**
* Validate configuration settings
* @param config Configuration to validate
* @throws IllegalArgumentException if configuration is invalid
*/
public static void validateConfiguration(ParserConfiguration config);
/**
* Get configuration warnings
* @param config Configuration to check
* @return List of configuration warnings
*/
public static List<String> getConfigurationWarnings(ParserConfiguration config);Install with Tessl CLI
npx tessl i tessl/maven-com-github-javaparser--javaparser-core