| /* |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You 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 org.apache.flex.compiler.internal.codegen.externals.reference; |
| |
| import java.io.File; |
| import java.util.Set; |
| |
| import org.apache.flex.compiler.clients.ExternCConfiguration.ExcludedMember; |
| |
| import com.google.javascript.rhino.JSDocInfo; |
| import com.google.javascript.rhino.JSDocInfo.Marker; |
| import com.google.javascript.rhino.JSDocInfo.StringPosition; |
| import com.google.javascript.rhino.JSDocInfo.TypePosition; |
| import com.google.javascript.rhino.JSTypeExpression; |
| import com.google.javascript.rhino.Node; |
| |
| public abstract class BaseReference |
| { |
| private String qualifiedName; |
| |
| protected JSDocInfo comment; |
| |
| private File currentFile; |
| |
| private Node node; |
| |
| private ReferenceModel model; |
| |
| protected String indent = " "; |
| |
| public File getCurrentFile() |
| { |
| return currentFile; |
| } |
| |
| public void setCurrentFile(File currentFile) |
| { |
| this.currentFile = currentFile; |
| } |
| |
| public String getBaseName() |
| { |
| return qualifiedName.substring(qualifiedName.lastIndexOf('.') + 1); |
| } |
| |
| public String getPackageName() |
| { |
| int end = qualifiedName.lastIndexOf('.'); |
| if (end == -1) |
| return ""; |
| return qualifiedName.substring(0, end); |
| } |
| |
| public String getQualifiedName() |
| { |
| return qualifiedName; |
| } |
| |
| public final boolean isQualifiedName() |
| { |
| return qualifiedName.indexOf('.') != -1; |
| } |
| |
| public Node getNode() |
| { |
| return node; |
| } |
| |
| public void setNode(Node node) |
| { |
| this.node = node; |
| } |
| |
| public void setComment(JSDocInfo comment) |
| { |
| this.comment = comment; |
| } |
| |
| public JSDocInfo getComment() |
| { |
| return comment; |
| } |
| |
| public ReferenceModel getModel() |
| { |
| return model; |
| } |
| |
| public BaseReference(ReferenceModel model, Node node, String qualifiedName, JSDocInfo comment) |
| { |
| this.model = model; |
| this.node = node; |
| this.qualifiedName = qualifiedName; |
| this.comment = comment; |
| } |
| |
| public ExcludedMember isExcluded() |
| { |
| return null; |
| } |
| |
| public abstract void emit(StringBuilder sb); |
| |
| public void emitComment(StringBuilder sb) |
| { |
| sb.append(indent); |
| sb.append("/**\n"); |
| emitCommentBody(sb); |
| sb.append(indent); |
| sb.append(" */\n"); |
| } |
| |
| protected void emitCommentBody(StringBuilder sb) |
| { |
| emitBlockDescription(sb); |
| emitSee(sb); |
| emitSeeSourceFileName(sb); |
| } |
| |
| protected void emitBlockDescription(StringBuilder sb) |
| { |
| String blockDescription = getComment().getBlockDescription(); |
| if (blockDescription != null) |
| { |
| sb.append(indent); |
| sb.append(" * "); |
| sb.append(blockDescription.replaceAll("\\n", "\n" + indent + " * ")); |
| sb.append("\n ").append(indent).append("*\n"); |
| } |
| } |
| |
| protected void emitSee(StringBuilder sb) |
| { |
| for (Marker marker : getComment().getMarkers()) |
| { |
| StringPosition name = marker.getAnnotation(); |
| TypePosition typePosition = marker.getType(); |
| StringPosition descriptionPosition = marker.getDescription(); |
| StringBuilder desc = new StringBuilder(); |
| |
| // XXX Figure out how to toString() a TypePosition Node for markers |
| // XXX Figure out how to get a @param name form the Marker |
| if (!name.getItem().equals("see")) |
| continue; |
| |
| desc.append(name.getItem()); |
| desc.append(" "); |
| |
| if (typePosition != null) |
| { |
| //desc.append(typePosition.getItem().getString()); |
| //desc.append(" "); |
| } |
| |
| if (descriptionPosition != null) |
| { |
| desc.append(descriptionPosition.getItem()); |
| desc.append(" "); |
| } |
| |
| sb.append(indent); |
| sb.append(" * @").append(desc.toString()).append("\n"); |
| } |
| } |
| |
| protected void emitSeeSourceFileName(StringBuilder sb) |
| { |
| sb.append(indent); |
| sb.append(" * @see ").append(getNode().getSourceFileName()).append("\n"); |
| } |
| |
| protected void emitFunctionCommentBody(StringBuilder sb) |
| { |
| emitBlockDescription(sb); |
| emitParams(sb); |
| emitSee(sb); |
| emitSeeSourceFileName(sb); |
| emitReturns(sb); |
| } |
| |
| protected void emitParams(StringBuilder sb) |
| { |
| Set<String> parameterNames = getComment().getParameterNames(); |
| for (String paramName : parameterNames) |
| { |
| JSTypeExpression parameterType = getComment().getParameterType(paramName); |
| String description = getComment().getDescriptionForParameter(paramName); |
| |
| sb.append(indent); |
| sb.append(" * @param "); |
| |
| sb.append(paramName); |
| sb.append(" "); |
| |
| if (parameterType != null) |
| { |
| sb.append("["); |
| sb.append(getModel().evaluate(parameterType).toAnnotationString()); |
| sb.append("]"); |
| sb.append(" "); |
| } |
| if (description != null) |
| sb.append(description); |
| sb.append("\n"); |
| } |
| } |
| |
| protected void emitReturns(StringBuilder sb) |
| { |
| if (getComment().hasReturnType()) |
| { |
| JSTypeExpression returnType = getComment().getReturnType(); |
| if (returnType != null) |
| { |
| sb.append(indent); |
| sb.append(" * @returns "); |
| sb.append("{"); |
| sb.append(getModel().evaluate(returnType).toAnnotationString()); |
| sb.append("} "); |
| String description = getComment().getReturnDescription(); |
| if (description != null) |
| sb.append(description); |
| sb.append("\n"); |
| } |
| } |
| } |
| } |