/*
* $Id$
*
* File is automatically generated by the Xtext language generator.
* Do not change it.
*
* SARL is an general-purpose agent programming language.
* More details on http://www.sarl.io
*
* Copyright (C) 2014-2017 the original authors or authors.
*
* 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 io.sarl.lang.documentation;
import io.sarl.lang.services.SARLGrammarAccess;
import javax.inject.Inject;
import org.eclipse.xtend.core.xtend.XtendMember;
import org.eclipse.xtext.AbstractElement;
import org.eclipse.xtext.AbstractRule;
import org.eclipse.xtext.Group;
import org.eclipse.xtext.Keyword;
import org.eclipse.xtext.UntilToken;
import org.eclipse.xtext.util.Strings;
import org.eclipse.xtext.xbase.lib.Pure;
/** Build a documentation string.
*/
public class EcoreDocumentationBuilder implements IEcoreDocumentationBuilder {
private AbstractRule mlRule;
private AbstractRule slRule;
private String mlStartSymbols;
private String mlEndTagSymbols;
private String slStartSymbols;
@Inject
private IDocumentationFormatter documentationFormatter;
@Inject
public void setGrammarAccess(SARLGrammarAccess access) {
this.mlRule = access.getML_COMMENTRule();
this.slRule = access.getSL_COMMENTRule();
for (AbstractElement element : ((Group) this.mlRule.getAlternatives()).getElements()) {
if (element instanceof Keyword && Strings.isEmpty(this.mlStartSymbols)) {
this.mlStartSymbols = ((Keyword) element).getValue();
} else if (element instanceof UntilToken && Strings.isEmpty(this.mlEndTagSymbols)) {
this.mlEndTagSymbols = ((Keyword) ((UntilToken) element).getTerminal()).getValue();
}
}
AbstractRule slRule = access.getSL_COMMENTRule();
for (AbstractElement element : ((Group) slRule.getAlternatives()).getElements()) {
if (element instanceof Keyword) {
this.slStartSymbols = ((Keyword) element).getValue().trim();
break;
}
}
}
@Pure
public AbstractRule getMLCommentRule() {
return this.mlRule;
}
@Pure
public AbstractRule getSLCommentRule() {
return this.slRule;
}
@Pure
public IDocumentationFormatter getDocumentationFormatter() {
return this.documentationFormatter;
}
@Pure
public boolean isMultilineCommentFor(Class<?> type) {
return XtendMember.class.isAssignableFrom(type);
}
@Pure
public String build(String doc, Class<?> objectType) {
String givenDocumentation = Strings.emptyIfNull(doc).trim();
StringBuilder documentation = new StringBuilder();
IDocumentationFormatter formatter = getDocumentationFormatter();
if (isMultilineCommentFor(objectType)) {
if (!givenDocumentation.startsWith(this.mlStartSymbols)) {
documentation.append(this.mlStartSymbols);
}
documentation.append(givenDocumentation);
if (!givenDocumentation.endsWith(this.mlEndTagSymbols)) {
documentation.append(this.mlEndTagSymbols);
}
return formatter.formatMultilineComment(documentation.toString());
}
documentation.append("\n");
if (!givenDocumentation.startsWith(this.slStartSymbols)) {
documentation.append(this.slStartSymbols);
}
documentation.append(givenDocumentation);
if (!givenDocumentation.isEmpty() && !isNewLine(givenDocumentation.charAt(givenDocumentation.length() - 1))) {
documentation.append("\n");
}
return formatter.formatSinglelineComment(documentation.toString());
}
private static boolean isNewLine(char character) {
if (character == '\n' || character == '\r' || character == '\f') {
return true;
}
return ((((1 << Character.LINE_SEPARATOR)
| (1 << Character.PARAGRAPH_SEPARATOR)) >> Character.getType((int) character)) & 1) != 0;
}
}