class Name extends Node implements NodeWithIdentifier<Name> {

    @NonEmptyProperty
    private String identifier;

    @OptionalProperty
    private Name qualifier;

    public Name() {
        this(null, null, "empty");
    }

    public Name(final String identifier) {
        this(null, null, identifier);
    }

    @AllFieldsConstructor
    public Name(Name qualifier, final String identifier) {
        this(null, qualifier, identifier);
    }

    /**
     * This constructor is used by the parser and is considered private.
     */
    @Generated("com.github.javaparser.generator.core.node.MainConstructorGenerator")
    public Name(TokenRange tokenRange, Name qualifier, String identifier) {
        super(tokenRange);
        setQualifier(qualifier);
        setIdentifier(identifier);
        customInitialization();
    }

    @Override
    @Generated("com.github.javaparser.generator.core.node.AcceptGenerator")
    public <R, A> R accept(final GenericVisitor<R, A> v, final A arg) {
        return v.visit(this, arg);
    }

    @Override
    @Generated("com.github.javaparser.generator.core.node.AcceptGenerator")
    public <A> void accept(final VoidVisitor<A> v, final A arg) {
        v.visit(this, arg);
    }

    @Generated("com.github.javaparser.generator.core.node.PropertyGenerator")
    public String getIdentifier() {
        return identifier;
    }

    @Generated("com.github.javaparser.generator.core.node.PropertyGenerator")
    public Name setIdentifier(final String identifier) {
        assertNonEmpty(identifier);
        if (identifier == this.identifier) {
            return this;
        }
        notifyPropertyChange(ObservableProperty.IDENTIFIER, this.identifier, identifier);
        this.identifier = identifier;
        return this;
    }

    /**
     * @return the complete qualified name. Only the identifiers and the dots, so no comments or whitespace.
     */
    public String asString() {
        if (qualifier != null) {
            return qualifier.asString() + "." + identifier;
        }
        return identifier;
    }

    @Generated("com.github.javaparser.generator.core.node.PropertyGenerator")
    public Optional<Name> getQualifier() {
        return Optional.ofNullable(qualifier);
    }

    @Generated("com.github.javaparser.generator.core.node.PropertyGenerator")
    public Name setQualifier(final Name qualifier) {
        if (qualifier == this.qualifier) {
            return this;
        }
        notifyPropertyChange(ObservableProperty.QUALIFIER, this.qualifier, qualifier);
        if (this.qualifier != null)
            this.qualifier.setParentNode(null);
        this.qualifier = qualifier;
        setAsParentNodeOf(qualifier);
        return this;
    }

    @Override
    @Generated("com.github.javaparser.generator.core.node.RemoveMethodGenerator")
    public boolean remove(Node node) {
        if (node == null) {
            return false;
        }
        if (qualifier != null) {
            if (node == qualifier) {
                removeQualifier();
                return true;
            }
        }
        return super.remove(node);
    }

    @Generated("com.github.javaparser.generator.core.node.RemoveMethodGenerator")
    public Name removeQualifier() {
        return setQualifier((Name) null);
    }

    @Override
    @Generated("com.github.javaparser.generator.core.node.CloneGenerator")
    public Name clone() {
        return (Name) accept(new CloneVisitor(), null);
    }

    @Override
    @Generated("com.github.javaparser.generator.core.node.GetMetaModelGenerator")
    public NameMetaModel getMetaModel() {
        return JavaParserMetaModel.nameMetaModel;
    }

    @Override
    @Generated("com.github.javaparser.generator.core.node.ReplaceMethodGenerator")
    public boolean replace(Node node, Node replacementNode) {<FILL_FUNCTION_BODY>}

    /**
     * A top level name is a name that is not contained in a larger Name instance.
     */
    public boolean isTopLevel() {
        return !isInternal();
    }

    /**
     * An internal name is a name that constitutes a part of a larger Name instance.
     */
    public boolean isInternal() {
        return getParentNode().filter(parent -> parent instanceof Name).isPresent();
    }
}

        if (node == null) {
            return false;
        }
        if (qualifier != null) {
            if (node == qualifier) {
                setQualifier((Name) replacementNode);
                return true;
            }
        }
        return super.replace(node, replacementNode);
    
<methods>public void addOrphanComment(com.github.javaparser.ast.comments.Comment) ,public com.github.javaparser.ast.Node clone() ,public boolean containsData(DataKey<?>) ,public boolean equals(java.lang.Object) ,public List<T> findAll(Class<T>) ,public List<T> findAll(Class<T>, com.github.javaparser.ast.Node.TreeTraversal) ,public List<T> findAll(Class<T>, Predicate<T>) ,public Optional<com.github.javaparser.ast.Node> findByRange(com.github.javaparser.Range) ,public Optional<com.github.javaparser.ast.CompilationUnit> findCompilationUnit() ,public Optional<M> findData(DataKey<M>) ,public Optional<T> findFirst(com.github.javaparser.ast.Node.TreeTraversal, Function<com.github.javaparser.ast.Node,Optional<T>>) ,public Optional<N> findFirst(Class<N>) ,public Optional<N> findFirst(Class<N>, Predicate<N>) ,public com.github.javaparser.ast.Node findRootNode() ,public List<com.github.javaparser.ast.comments.Comment> getAllContainedComments() ,public List<com.github.javaparser.ast.Node> getChildNodes() ,public List<N> getChildNodesByType(Class<N>) ,public Optional<com.github.javaparser.ast.comments.Comment> getComment() ,public M getData(DataKey<M>) ,public Set<DataKey<?>> getDataKeys() ,public com.github.javaparser.utils.LineSeparator getLineEndingStyle() ,public com.github.javaparser.utils.LineSeparator getLineEndingStyleOrDefault(com.github.javaparser.utils.LineSeparator) ,public com.github.javaparser.metamodel.NodeMetaModel getMetaModel() ,public List<N> getNodesByType(Class<N>) ,public List<com.github.javaparser.ast.comments.Comment> getOrphanComments() ,public Optional<com.github.javaparser.ast.Node> getParentNode() ,public com.github.javaparser.ast.Node getParentNodeForChildren() ,public com.github.javaparser.ast.Node.Parsedness getParsed() ,public Optional<com.github.javaparser.Range> getRange() ,public com.github.javaparser.resolution.SymbolResolver getSymbolResolver() ,public Optional<com.github.javaparser.TokenRange> getTokenRange() ,public boolean hasScope() ,public final int hashCode() ,public boolean isAncestorOf(com.github.javaparser.ast.Node) ,public boolean isPhantom() ,public boolean isRegistered(com.github.javaparser.ast.observer.AstObserver) ,public void notifyPropertyChange(com.github.javaparser.ast.observer.ObservableProperty, P, P) ,public void register(com.github.javaparser.ast.observer.AstObserver) ,public void register(com.github.javaparser.ast.observer.AstObserver, com.github.javaparser.ast.Node.ObserverRegistrationMode) ,public void registerForSubtree(com.github.javaparser.ast.observer.AstObserver) ,public boolean remove() ,public boolean remove(com.github.javaparser.ast.Node) ,public com.github.javaparser.ast.Node removeComment() ,public void removeData(DataKey<?>) ,public void removeForced() ,public boolean removeOrphanComment(com.github.javaparser.ast.comments.Comment) ,public boolean replace(com.github.javaparser.ast.Node) ,public boolean replace(com.github.javaparser.ast.Node, com.github.javaparser.ast.Node) ,public final com.github.javaparser.ast.Node setBlockComment(java.lang.String) ,public com.github.javaparser.ast.Node setComment(com.github.javaparser.ast.comments.Comment) ,public void setData(DataKey<M>, M) ,public final com.github.javaparser.ast.Node setLineComment(java.lang.String) ,public com.github.javaparser.ast.Node setParentNode(com.github.javaparser.ast.Node) ,public com.github.javaparser.ast.Node setParsed(com.github.javaparser.ast.Node.Parsedness) ,public com.github.javaparser.ast.Node setRange(com.github.javaparser.Range) ,public com.github.javaparser.ast.Node setTokenRange(com.github.javaparser.TokenRange) ,public Stream<com.github.javaparser.ast.Node> stream(com.github.javaparser.ast.Node.TreeTraversal) ,public Stream<com.github.javaparser.ast.Node> stream() ,public final java.lang.String toString() ,public final java.lang.String toString(com.github.javaparser.printer.configuration.PrinterConfiguration) ,public void tryAddImportToParentCompilationUnit(Class<?>) ,public void unregister(com.github.javaparser.ast.observer.AstObserver) ,public void walk(com.github.javaparser.ast.Node.TreeTraversal, Consumer<com.github.javaparser.ast.Node>) ,public void walk(Consumer<com.github.javaparser.ast.Node>) ,public void walk(Class<T>, Consumer<T>) <variables>public static final int ABSOLUTE_BEGIN_LINE,public static final int ABSOLUTE_END_LINE,private static final int LEVELS_TO_EXPLORE,public static final DataKey<com.github.javaparser.utils.LineSeparator> LINE_SEPARATOR_KEY,public static Comparator<NodeWithRange<?>> NODE_BY_BEGIN_POSITION,protected static final DataKey<java.lang.Boolean> PHANTOM_KEY,protected static final DataKey<com.github.javaparser.printer.Printer> PRINTER_KEY,public static final DataKey<com.github.javaparser.resolution.SymbolResolver> SYMBOL_RESOLVER_KEY,private ArrayList<com.github.javaparser.ast.Node> childNodes,private com.github.javaparser.ast.comments.Comment comment,private IdentityHashMap<DataKey<?>,java.lang.Object> data,private ArrayList<com.github.javaparser.ast.observer.AstObserver> observers,private ArrayList<com.github.javaparser.ast.comments.Comment> orphanComments,private com.github.javaparser.ast.Node parentNode,private com.github.javaparser.ast.Node.Parsedness parsed,protected static final com.github.javaparser.printer.configuration.PrinterConfiguration prettyPrinterNoCommentsConfiguration,private com.github.javaparser.Range range,private com.github.javaparser.TokenRange tokenRange