blob: 52931b8a67d0cd55c9aa835bb9359c6104de4f1b [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.apache.royale.compiler.asdoc;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import org.apache.royale.compiler.internal.parsing.as.ASDocToken;
import org.apache.royale.compiler.internal.parsing.as.ASDocTokenizer;
import org.apache.royale.compiler.internal.parsing.as.ASToken;
import org.apache.royale.compiler.internal.parsing.as.ASTokenTypes;
import org.apache.royale.compiler.tree.as.IDocumentableDefinitionNode;
import antlr.Token;
public class ASDocComment implements IASDocComment
{
private ASToken token;
@SuppressWarnings("unused")
private IDocumentableDefinitionNode node;
private String description;
Map<String, List<IASDocTag>> tags = new TreeMap<String, List<IASDocTag>>();
public ASDocComment(ASToken token, IDocumentableDefinitionNode node)
{
this.token = token;
this.node = node;
}
/**
* @param token The asdoc token.
*/
public ASDocComment(Token token)
{
this.token = (ASToken)token;
}
@Override
public void compile()
{
if (token == null)
return;
String data = token.getText();
ASDocTokenizer tokenizer = new ASDocTokenizer(false);
tokenizer.setReader(new StringReader(data));
ASDocToken tok = tokenizer.next();
boolean foundDescription = false;
ASDocTag pendingTag = null;
try
{
while (tok != null)
{
if (!foundDescription && tok.getType() == ASTokenTypes.TOKEN_ASDOC_TEXT)
{
description = tok.getText();
}
else
{
// do tags
if (tok.getType() == ASTokenTypes.TOKEN_ASDOC_TAG)
{
if (pendingTag != null)
{
addTag(pendingTag);
}
pendingTag = new ASDocTag(tok.getText().substring(1));
}
else if (tok.getType() == ASTokenTypes.TOKEN_ASDOC_TEXT)
{
if(pendingTag != null) {
pendingTag.setDescription(tok.getText());
addTag(pendingTag);
pendingTag = null;
}
}
}
foundDescription = true;
tok = tokenizer.next();
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
private void addTag(ASDocTag tag)
{
List<IASDocTag> list = tags.get(tag.getName());
if (list == null)
{
list = new ArrayList<IASDocTag>();
tags.put(tag.getName(), list);
}
list.add(tag);
}
@Override
public String toString()
{
return "ASASDocComment [description=" + description + "]";
}
@Override
public String getDescription()
{
return description;
}
//--------------------------------------------------------------------------
// ASDocTag
//--------------------------------------------------------------------------
class ASDocTag implements IASDocTag
{
private String name;
private String description;
public ASDocTag(String name)
{
if (name.indexOf('@') == 0)
name = name.substring(1);
this.setName(name);
}
public ASDocTag(String name, String description)
{
this(name);
setDescription(description);
}
@Override
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
@Override
public String getDescription()
{
return description;
}
public void setDescription(String description)
{
this.description = description;
}
@Override
public boolean hasDescription()
{
return description != null && !description.equals("");
}
}
@Override
public boolean hasTag(String name)
{
List<IASDocTag> list = tags.get(name);
if (list == null || list.size() == 0)
return false;
return true;
}
@Override
public IASDocTag getTag(String name)
{
List<IASDocTag> list = tags.get(name);
if (list == null || list.size() == 0)
return null;
return list.get(0);
}
@Override
public Map<String, List<IASDocTag>> getTags()
{
// TODO return unmodifiable
return tags;
}
@Override
public List<IASDocTag> getTagsByName(String name)
{
List<IASDocTag> result = new ArrayList<IASDocTag>();
List<IASDocTag> list = tags.get(name);
if (list == null)
return result;
for (IASDocTag tag : list)
{
result.add(tag);
}
return result;
}
@Override
public void paste(IASDocComment source)
{
//
description = source.getDescription();
IASDocTag tag;
if (source.hasTag("return"))
{
tag = source.getTag("return");
addTag(new ASDocTag(tag.getName(), tag.getDescription()));
}
if (source.hasTag("param"))
{
Collection<IASDocTag> tags = source.getTagsByName("param");
for (IASDocTag ptag : tags)
{
addTag(new ASDocTag(ptag.getName(), ptag.getDescription()));
}
}
}
}