package com.hundsun.ares.studio.cres.text.assistant;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.IDocument;
import com.hundsun.ares.studio.core.IARESResource;
public class StructAssistantLoader extends AbstractAssistantLoader {
IARESResource resource;
public StructAssistantLoader(IARESResource resource){
this.resource = resource;
}
private final static String PREFIX = "->";
@Override
public List<String> loadAssitant(String text, IDocument doc, int offset) {
Map<String, List<String>> map = CustomFunctionFactory.eINSTANCE.getAllStructMap(resource.getARESProject());
List<String> allproposals = new ArrayList<String>();
try {
int preOffset = offset-text.length()-2;
if(preOffset >= 0){
String pre = doc.get(preOffset, 2);
//�鿴ǰ�������ַ��Ƿ���->
if(pre.equals(PREFIX)){
for(Entry<String, List<String>> entry : map.entrySet()){
allproposals.addAll(entry.getValue());
}
}
}
} catch (BadLocationException e) {
e.printStackTrace();
}
return allproposals;
}
@Override
public String getReplacement(String display) {
//��Сд��ͷ�����ſ����д�Сд��ĸ�����֡��»��ߣ����ſ����ɿո���(��β
Pattern pattern = Pattern.compile("\\b[a-zA-Z]+[a-zA-Z0-9_]*\\s*\\(");
Matcher matcher = pattern.matcher(display);
if(matcher.find()){
String replace = matcher.group();
List<String> params = getParams(display);
for(int index=0; index<params.size(); index++){
String param = params.get(index);
if(index>0){
replace += ",";
}
replace += param;
}
replace += ")";
return replace;
}
return display;
}
/**
* @param display
* @return
*/
private List<String> getParams(String display) {
List<String> list = new ArrayList<String>();
//��Сд��ͷ���ɽӴ�Сд�����»��ߣ�֮������пո������ַ���������
Pattern pattern = Pattern.compile("[a-zA-Z]+[a-zA-Z0-9_]*\\s*$");
String paramDefine = display.substring(display.indexOf("(")+1, display.indexOf(")")).trim();
if(paramDefine.equalsIgnoreCase("void")){
//����Ϊvoid
return list;
}
for(String tmp : paramDefine.split(",")){
//�еȺ����ʾ��Ĭ��ֵ��ֱ�Ӻ��Ըò���
if(!tmp.contains("=")){
Matcher matcher = pattern.matcher(tmp);
if(matcher.find()){
list.add(matcher.group());
}
}
}
return list;
}
}