/*
* 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.devtools.j2objc.ast;
import java.util.ArrayList;
import java.util.List;
import javax.lang.model.type.TypeMirror;
/**
* A native declaration. Contains string contents without any structural context
* other than whether the content is for the header or implementation.
*/
public class NativeDeclaration extends BodyDeclaration {
// Whether this declaration should be placed inside or outside the @interface
// or @implementation block.
private boolean isOuter = false;
private String headerCode = null;
private String implementationCode = null;
private List<TypeMirror> implementationImportTypes = new ArrayList<>();
public NativeDeclaration(NativeDeclaration other) {
isOuter = other.isOuter();
headerCode = other.getHeaderCode();
implementationCode = other.getImplementationCode();
implementationImportTypes.addAll(other.getImplementationImportTypes());
}
/**
* Creates a new NativeDeclaration. For proper spacing, the convention is
* that the code snippets end with a newline.
*
* @param isOuter Whether this code should be outside the ObjC class
* definition.
* @param headerCode Code to be printed in the type interface.
* @param implementationCode Code to be printed in the type implementation.
*/
public NativeDeclaration(boolean isOuter, String headerCode, String implementationCode) {
this.isOuter = isOuter;
this.headerCode = headerCode;
this.implementationCode = implementationCode;
}
public static NativeDeclaration newInnerDeclaration(
String headerCode, String implementationCode) {
return new NativeDeclaration(false, headerCode, implementationCode);
}
public static NativeDeclaration newOuterDeclaration(
String headerCode, String implementationCode) {
return new NativeDeclaration(true, headerCode, implementationCode);
}
@Override
public Kind getKind() {
return Kind.NATIVE_DECLARATION;
}
public boolean isOuter() {
return isOuter;
}
public String getHeaderCode() {
return headerCode;
}
public String getImplementationCode() {
return implementationCode;
}
public List<TypeMirror> getImplementationImportTypes() {
return implementationImportTypes;
}
@Override
protected void acceptInner(TreeVisitor visitor) {
visitor.visit(this);
visitor.endVisit(this);
}
@Override
public NativeDeclaration copy() {
return new NativeDeclaration(this);
}
public NativeDeclaration addImplementationImportType(TypeMirror type) {
implementationImportTypes.add(type);
return this;
}
}