blob: a1fd4aa4073053ec4adbfb749cb08ae0936c11bb [file] [log] [blame]
/*
* 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.netbeans.modules.javascript2.jsdoc.model;
import java.util.ArrayList;
import java.util.List;
import org.netbeans.modules.javascript2.doc.spi.DocParameter;
import org.netbeans.modules.javascript2.types.api.Identifier;
import org.netbeans.modules.javascript2.types.api.Type;
/**
* Represents named parameter element.
* <p>
* <i>Examples:</i> @param {MyType} myName myDescription,...
*
* @author Martin Fousek <marfous@netbeans.org>
*/
public class NamedParameterElement extends ParameterElement implements DocParameter {
private final Identifier paramName;
private final boolean optional;
private final String defaultValue;
private NamedParameterElement(JsDocElementType type, Identifier paramName,
List<Type> paramTypes, String paramDescription,
boolean optional, String defaultValue) {
super(type, paramTypes, paramDescription);
this.paramName = paramName;
this.optional = optional;
this.defaultValue = defaultValue;
}
/**
* Creates named parameter element.
* @param type type of the element
* @param paramName name of the parameter
* @param paramTypes type of the parameter
* @param paramDescription description of the parameter
* @param optional flag if the parameter is optional
* @param defaultValue default value of the parameter
*/
public static NamedParameterElement create(JsDocElementType type, Identifier paramName,
List<Type> paramTypes, String paramDescription,
boolean optional, String defaultValue) {
return new NamedParameterElement(type, paramName, paramTypes, paramDescription, optional, defaultValue);
}
/**
* Creates named parameter element.
* <p>
* This creates optional parameter with no default value.
* @param type type of the element
* @param paramName name of the parameter
* @param paramTypes type of the parameter
* @param paramDescription description of the parameter
* @param optional flag if the parameter is optional
*/
public static NamedParameterElement create(JsDocElementType type, Identifier paramName,
List<Type> paramTypes, String paramDescription,
boolean optional) {
return new NamedParameterElement(type, paramName, paramTypes, paramDescription, optional, null);
}
/**
* Creates named parameter element.
* <p>
* This creates mandatory parameter with no default value.
* @param type type of the element
* @param paramName name of the parameter
* @param paramTypes type of the parameter
* @param paramDescription description of the parameter
*/
public static NamedParameterElement create(JsDocElementType type, Identifier paramName,
List<Type> paramTypes, String paramDescription) {
return new NamedParameterElement(type, paramName, paramTypes, paramDescription, false, null);
}
/**
* Creates named parameter element.
* <p>
* Also do diagnostics on paramName if the parameter isn't optional and with default value
* and types, whether use in Google Compiler Syntax.
* @param type type of the element
* @param paramName name of the parameter
* @param paramTypes type of the parameter
* @param paramDescription description of the parameter
*/
public static NamedParameterElement createWithDiagnostics(JsDocElementType type, Identifier paramName,
List<Type> paramTypes, String paramDescription) {
int nameStartOffset = paramName.getOffsetRange().getStart();
String name = paramName.getName();
if (name.indexOf('~') > 0) {
// we dont't replace tilda if it's on the first position
name = name.replace('~', '.'); // replacing tilda with dot. See issue #25110
}
boolean optional = name.matches("\\[.*\\]"); //NOI18N
String defaultValue = null;
List<Type> correctedTypes = new ArrayList<>();
if (optional) {
nameStartOffset++;
name = name.substring(1, name.length() - 1);
int indexOfEqual = name.indexOf("=");
if (indexOfEqual != -1) {
defaultValue = name.substring(indexOfEqual + 1);
name = name.substring(0, indexOfEqual);
}
correctedTypes.addAll(paramTypes);
} else {
for (Type paramType : paramTypes) {
boolean changed = false;
String paramTypeName = paramType.getType();
if (paramTypeName.indexOf('~') > 0) {
paramTypeName = paramTypeName.replace('~', '.');
changed = true;
}
if (JsDocElementUtils.GoogleCompilerSytax.canBeThisSyntax(paramType.getType())) {
if (JsDocElementUtils.GoogleCompilerSytax.isMarkedAsOptional(paramTypeName)) {
optional = true;
changed = true;
paramTypeName = JsDocElementUtils.GoogleCompilerSytax.removeSyntax(paramTypeName);
}
}
if (changed) {
correctedTypes.add(JsDocElementUtils.createTypeUsage(paramTypeName, paramType.getOffset()));
} else {
correctedTypes.add(paramType);
}
}
}
return new NamedParameterElement(type, new Identifier(name, nameStartOffset), correctedTypes,
paramDescription, optional, defaultValue);
}
/**
* Gets name of the parameter.
* @return parameter name
*/
@Override
public Identifier getParamName() {
return paramName;
}
/**
* Gets default value of the parameter.
* @return default value
*/
@Override
public String getDefaultValue() {
return defaultValue;
}
/**
* Get information if the parameter is optional or not.
* @return flag which is {@code true} if the parameter is optional, {@code false} otherwise
*/
@Override
public boolean isOptional() {
return optional;
}
}