All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.sourceforge.pmd.lang.java.ast.ASTCatchParameter Maven / Gradle / Ivy

There is a newer version: 7.7.0
Show newest version
/**
 * BSD-style license; for more info see http://pmd.sourceforge.net/license.html
 */

package net.sourceforge.pmd.lang.java.ast;

import java.util.Collection;

import org.checkerframework.checker.nullness.qual.NonNull;

import net.sourceforge.pmd.lang.ast.NodeStream;
import net.sourceforge.pmd.lang.java.types.JIntersectionType;
import net.sourceforge.pmd.lang.java.types.TypeSystem;


/**
 * Formal parameter of a {@linkplain ASTCatchClause catch clause}
 * to represent the declared exception variable.
 *
 * 
 *
 * CatchParameter ::= {@link ASTModifierList LocalVarModifierList} {@link ASTType Type} {@link ASTVariableDeclaratorId VariableDeclaratorId}
 *
 * 
*/ public final class ASTCatchParameter extends AbstractJavaNode implements InternalInterfaces.VariableIdOwner, FinalizableNode { ASTCatchParameter(int id) { super(id); } @Override protected R acceptVisitor(JavaVisitor visitor, P data) { return visitor.visit(this, data); } /** * Returns true if this is a multi-catch parameter, * that is, it catches several unrelated exception types * at the same time. For example: * *
catch (IllegalStateException | IllegalArgumentException e) {}
*/ public boolean isMulticatch() { return getTypeNode() instanceof ASTUnionType; } @Override @NonNull public ASTVariableDeclaratorId getVarId() { return (ASTVariableDeclaratorId) getLastChild(); } /** Returns the name of this parameter. */ public String getName() { return getVarId().getName(); } /** * Returns the type node of this catch parameter. May be a * {@link ASTUnionType UnionType}. */ public ASTType getTypeNode() { return (ASTType) getChild(1); } /** * Returns a stream of all declared exception types (expanding a union * type if present). * *

Note that this is the only reliable way to inspect multi-catch clauses, * as the type mirror of a {@link ASTUnionType} is not itself a {@link JIntersectionType}, * but the {@link TypeSystem#lub(Collection) LUB} of the components. * Since exception types cannot be interfaces, the LUB always erases * to a single class supertype (eg {@link RuntimeException}). */ public NodeStream getAllExceptionTypes() { ASTType typeNode = getTypeNode(); if (typeNode instanceof ASTUnionType) { return typeNode.children(ASTClassOrInterfaceType.class); } else { return NodeStream.of((ASTClassOrInterfaceType) typeNode); } } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy