Skip to content

Commit

Permalink
feat: add PackageInfoDefinition AST node
Browse files Browse the repository at this point in the history
  • Loading branch information
miraleung committed Oct 23, 2020
1 parent 2691d8c commit 01b8051
Show file tree
Hide file tree
Showing 6 changed files with 174 additions and 3 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -93,4 +93,6 @@ public interface AstNodeVisitor {
public void visit(MethodDefinition methodDefinition);

public void visit(ClassDefinition classDefinition);

public void visit(PackageInfoDefinition packageInfoDefinition);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
// Copyright 2020 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package com.google.api.generator.engine.ast;

import com.google.auto.value.AutoValue;
import com.google.common.collect.ImmutableList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

@AutoValue
public abstract class PackageInfoDefinition implements AstNode {
public abstract String pakkage();

public abstract ImmutableList<CommentStatement> fileHeader();

public abstract ImmutableList<CommentStatement> headerCommentStatements();

public abstract ImmutableList<AnnotationNode> annotations();

@Override
public void accept(AstNodeVisitor visitor) {
visitor.visit(this);
}

public static Builder builder() {
return new AutoValue_PackageInfoDefinition.Builder()
.setFileHeader(Collections.emptyList())
.setHeaderCommentStatements(Collections.emptyList())
.setAnnotations(Collections.emptyList());
}

@AutoValue.Builder
public abstract static class Builder {
public abstract Builder setPakkage(String pakkage);

public Builder setFileHeader(CommentStatement... headerComments) {
return setFileHeader(Arrays.asList(headerComments));
}

public abstract Builder setFileHeader(List<CommentStatement> fileHeader);

public Builder setHeaderCommentStatements(CommentStatement... comments) {
return setHeaderCommentStatements(Arrays.asList(comments));
}

public abstract Builder setHeaderCommentStatements(
List<CommentStatement> headerCommentStatements);

public Builder setAnnotations(AnnotationNode... annotations) {
return setAnnotations(Arrays.asList(annotations));
}

public abstract Builder setAnnotations(List<AnnotationNode> annotations);

public abstract PackageInfoDefinition build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@
import com.google.api.generator.engine.ast.MethodDefinition;
import com.google.api.generator.engine.ast.MethodInvocationExpr;
import com.google.api.generator.engine.ast.NewObjectExpr;
import com.google.api.generator.engine.ast.PackageInfoDefinition;
import com.google.api.generator.engine.ast.Reference;
import com.google.api.generator.engine.ast.ReferenceConstructorExpr;
import com.google.api.generator.engine.ast.RelationalOperationExpr;
Expand All @@ -56,12 +57,15 @@
import com.google.api.generator.engine.ast.VariableExpr;
import com.google.api.generator.engine.ast.WhileStatement;
import com.google.common.base.Preconditions;
import com.google.common.base.Strings;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;

public class ImportWriterVisitor implements AstNodeVisitor {
private static final String NEWLINE = "\n";
Expand All @@ -71,14 +75,19 @@ public class ImportWriterVisitor implements AstNodeVisitor {
private final Set<String> imports = new TreeSet<>();

private String currentPackage;
private String currentClassName;
@Nullable private String currentClassName;

public void clear() {
staticImports.clear();
imports.clear();
}

public void initialize(String currentPackage, String currentClassName) {
public void initialize(@Nonnull String currentPackage) {
this.currentPackage = currentPackage;
this.currentClassName = null;
}

public void initialize(@Nonnull String currentPackage, @Nonnull String currentClassName) {
this.currentPackage = currentPackage;
this.currentClassName = currentClassName;
}
Expand Down Expand Up @@ -370,6 +379,11 @@ public void visit(ClassDefinition classDefinition) {
}
}

@Override
public void visit(PackageInfoDefinition packageInfoDefinition) {
annotations(packageInfoDefinition.annotations());
}

/** =============================== PRIVATE HELPERS =============================== */
private void annotations(List<AnnotationNode> annotations) {
for (AnnotationNode annotation : annotations) {
Expand Down Expand Up @@ -407,7 +421,9 @@ private void references(List<Reference> refs) {
continue;
}

if (ref.isStaticImport() && ref.enclosingClassName().equals(currentClassName)) {
if (ref.isStaticImport()
&& !Strings.isNullOrEmpty(currentClassName)
&& ref.enclosingClassName().equals(currentClassName)) {
continue;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@
import com.google.api.generator.engine.ast.MethodInvocationExpr;
import com.google.api.generator.engine.ast.NewObjectExpr;
import com.google.api.generator.engine.ast.OperatorKind;
import com.google.api.generator.engine.ast.PackageInfoDefinition;
import com.google.api.generator.engine.ast.ReferenceConstructorExpr;
import com.google.api.generator.engine.ast.RelationalOperationExpr;
import com.google.api.generator.engine.ast.ReturnExpr;
Expand Down Expand Up @@ -859,6 +860,26 @@ public void visit(ClassDefinition classDefinition) {
}
}

@Override
public void visit(PackageInfoDefinition packageInfoDefinition) {
statements(packageInfoDefinition.fileHeader().stream().collect(Collectors.toList()));
newline();
statements(
packageInfoDefinition.headerCommentStatements().stream().collect(Collectors.toList()));
newline();

annotations(packageInfoDefinition.annotations());
buffer.append(String.format("package %s;", packageInfoDefinition.pakkage()));
newline();

packageInfoDefinition.accept(importWriterVisitor);
importWriterVisitor.initialize(packageInfoDefinition.pakkage());
buffer.append(importWriterVisitor.write());

// Format code.
buffer.replace(0, buffer.length(), JavaFormatter.format(buffer.toString()));
}

/** =============================== PRIVATE HELPERS =============================== */
private void annotations(List<AnnotationNode> annotations) {
for (AnnotationNode annotation : annotations) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,24 +19,29 @@
import static junit.framework.Assert.assertFalse;
import static junit.framework.Assert.assertTrue;

import com.google.api.generator.engine.ast.AnnotationNode;
import com.google.api.generator.engine.ast.AnonymousClassExpr;
import com.google.api.generator.engine.ast.ArithmeticOperationExpr;
import com.google.api.generator.engine.ast.AssignmentExpr;
import com.google.api.generator.engine.ast.AstNode;
import com.google.api.generator.engine.ast.BlockComment;
import com.google.api.generator.engine.ast.CastExpr;
import com.google.api.generator.engine.ast.ClassDefinition;
import com.google.api.generator.engine.ast.CommentStatement;
import com.google.api.generator.engine.ast.ConcreteReference;
import com.google.api.generator.engine.ast.EmptyLineStatement;
import com.google.api.generator.engine.ast.EnumRefExpr;
import com.google.api.generator.engine.ast.Expr;
import com.google.api.generator.engine.ast.ExprStatement;
import com.google.api.generator.engine.ast.IfStatement;
import com.google.api.generator.engine.ast.InstanceofExpr;
import com.google.api.generator.engine.ast.JavaDocComment;
import com.google.api.generator.engine.ast.LogicalOperationExpr;
import com.google.api.generator.engine.ast.MethodDefinition;
import com.google.api.generator.engine.ast.MethodInvocationExpr;
import com.google.api.generator.engine.ast.NewObjectExpr;
import com.google.api.generator.engine.ast.NullObjectValue;
import com.google.api.generator.engine.ast.PackageInfoDefinition;
import com.google.api.generator.engine.ast.Reference;
import com.google.api.generator.engine.ast.ReferenceConstructorExpr;
import com.google.api.generator.engine.ast.RelationalOperationExpr;
Expand Down Expand Up @@ -64,6 +69,7 @@
import java.util.List;
import java.util.Map;
import java.util.stream.LongStream;
import javax.annotation.Generated;
import org.junit.Before;
import org.junit.Test;

Expand Down Expand Up @@ -1029,6 +1035,27 @@ public void writeEmptyLineStatementImports() {
assertThat(writerVisitor.write()).isEmpty();
}

@Test
public void writePackageInfoDefinitionImports() {
PackageInfoDefinition packageInfo =
PackageInfoDefinition.builder()
.setPakkage("com.google.example.library.v1")
.setAnnotations(
AnnotationNode.withType(
TypeNode.withReference(ConcreteReference.withClazz(Generated.class))))
.setFileHeader(
CommentStatement.withComment(
BlockComment.withComment("Lorum ipsum dolor sit amet")))
.setHeaderCommentStatements(
CommentStatement.withComment(
JavaDocComment.withComment("Consecteteur adipisping elit")))
.build();

packageInfo.accept(writerVisitor);
assertEquals(writerVisitor.write(), "import javax.annotation.Generated;\n\n");
}

/** =============================== HELPERS =============================== */
private static TypeNode createType(Class clazz) {
return TypeNode.withReference(ConcreteReference.withClazz(clazz));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@
import com.google.api.generator.engine.ast.MethodInvocationExpr;
import com.google.api.generator.engine.ast.NewObjectExpr;
import com.google.api.generator.engine.ast.NullObjectValue;
import com.google.api.generator.engine.ast.PackageInfoDefinition;
import com.google.api.generator.engine.ast.PrimitiveValue;
import com.google.api.generator.engine.ast.Reference;
import com.google.api.generator.engine.ast.ReferenceConstructorExpr;
Expand Down Expand Up @@ -73,6 +74,7 @@
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeoutException;
import javax.annotation.Generated;
import org.junit.Before;
import org.junit.Test;

Expand Down Expand Up @@ -2242,6 +2244,39 @@ public void writeEmptyLineStatement() {
assertEquals(writerVisitor.write(), "\n");
}

@Test
public void writePackageInfoDefinition() {
PackageInfoDefinition packageInfo =
PackageInfoDefinition.builder()
.setPakkage("com.google.example.library.v1")
.setAnnotations(
AnnotationNode.withType(
TypeNode.withReference(ConcreteReference.withClazz(Generated.class))))
.setFileHeader(
CommentStatement.withComment(
BlockComment.withComment("Lorum ipsum dolor sit amet")))
.setHeaderCommentStatements(
CommentStatement.withComment(
JavaDocComment.withComment("Consecteteur adipisping elit")))
.build();

packageInfo.accept(writerVisitor);
assertEquals(
String.format(
createLines(9),
"/*\n",
" * Lorum ipsum dolor sit amet\n",
" */\n",
"\n",
"/** Consecteteur adipisping elit */\n",
"@Generated\n",
"package com.google.example.library.v1;\n",
"\n",
"import javax.annotation.Generated;\n"),
writerVisitor.write());
}

/** =============================== HELPERS =============================== */
private static String createLines(int numLines) {
return new String(new char[numLines]).replace("\0", "%s");
}
Expand Down

0 comments on commit 01b8051

Please sign in to comment.