Commit 55ad550f authored by Philip Makedonski's avatar Philip Makedonski
Browse files

+ added scope rebuilder (not operational yet)

+ added some preference pages for configuring the warnings
+ refined syntax highlighting
parent c68296dc
Loading
Loading
Loading
Loading
+112 −0
Original line number Diff line number Diff line
package de.ugoe.cs.swe.ui;

import java.util.List;

import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.xtext.builder.BuilderParticipant;
import org.eclipse.xtext.builder.EclipseResourceFileSystemAccess2;
import org.eclipse.xtext.builder.IXtextBuilderParticipant;
import org.eclipse.xtext.generator.IFileSystemAccess;
import org.eclipse.xtext.generator.IGenerator2;
import org.eclipse.xtext.resource.IContainer;
import org.eclipse.xtext.resource.IResourceDescription;
import org.eclipse.xtext.resource.IResourceDescription.Delta;
import org.eclipse.xtext.resource.IResourceDescriptions;
import org.eclipse.xtext.resource.impl.ResourceDescriptionsProvider;

import com.google.inject.Inject;

import de.ugoe.cs.swe.common.CommonHelper;
import de.ugoe.cs.swe.common.PreAnalyzer;
import de.ugoe.cs.swe.scoping.TTCN3GlobalScopeProvider;
import de.ugoe.cs.swe.tTCN3.TTCN3Module;
import de.ugoe.cs.swe.validation.TTCN3StatisticsProvider;

public class ScopeRebuild extends BuilderParticipant {
	@Inject
	private ResourceDescriptionsProvider resourceDescriptionsProvider;

	@Inject
	private IContainer.Manager containerManager;

	@Inject(optional = true)
	private IGenerator2 generator;

	protected ThreadLocal<Boolean> buildSemaphor = new ThreadLocal<Boolean>();

	@Override
	public void build(IBuildContext context, IProgressMonitor monitor) throws CoreException {
		buildSemaphor.set(false);
		super.build(context, monitor);
	}

	@Override
	protected void handleChangedContents(IResourceDescription.Delta delta,
			IXtextBuilderParticipant.IBuildContext context, EclipseResourceFileSystemAccess2 fileSystemAccess)
			throws org.eclipse.core.runtime.CoreException {
		super.handleChangedContents(delta, context, fileSystemAccess);
		if (!buildSemaphor.get()) {
			//invokeRebuild(delta, context, fileSystemAccess);
		}
	}

	private void invokeRebuild(Delta delta, IBuildContext context, IFileSystemAccess fileSystemAccess) {
		buildSemaphor.set(true);
		//TODO: make this context specific
		//NOTE: probably won't work without better integration
		System.out.println("Rebuilding..");
		Resource resource = context.getResourceSet().getResource(delta.getUri(), true);
//		if (shouldGenerate(resource, context)) {
//			IResourceDescriptions index = resourceDescriptionsProvider.createResourceDescriptions();
//			IResourceDescription resDesc = index.getResourceDescription(resource.getURI());
//			List<IContainer> visibleContainers = containerManager.getVisibleContainers(resDesc, index);
//			for (IContainer c : visibleContainers) {
//				for (IResourceDescription rd : c.getResourceDescriptions()) {
//					context.getResourceSet().getResource(rd.getURI(), true);
//				}
//			}
//
//			//generator.doGenerate(context.getResourceSet(), fileSystemAccess);
//		}
		
		
		TTCN3GlobalScopeProvider.RESOURCES.clear();
		TTCN3GlobalScopeProvider.NAMED_MODULES.clear();
		TTCN3GlobalScopeProvider.EXPORTED_OBJECTS.clear();
		TTCN3GlobalScopeProvider.IMPORTS.clear();
		TTCN3GlobalScopeProvider.IMPORTED_FROM.clear();
		TTCN3GlobalScopeProvider.IMPORTED_RESOURCES.clear();
		TTCN3GlobalScopeProvider.STATIC_SCOPE.clear();
		System.out.println("Reset Master : "+resource.getURI());

		for (IResourceDescription d : resourceDescriptionsProvider.getResourceDescriptions(context.getResourceSet()).getAllResourceDescriptions()) {
			Resource r = resource.getResourceSet().getResource(d.getURI(), true);
			System.out.println("Reset: "+d.getURI());
			TTCN3Module module = CommonHelper.getModule(r);
			if (!TTCN3GlobalScopeProvider.NAMED_MODULES.containsKey(module.getName())) {
				TTCN3GlobalScopeProvider.RESOURCES.add(r);
				TTCN3GlobalScopeProvider.NAMED_MODULES.put(module.getName(), module);
			}
		}

		for (IResourceDescription d : resourceDescriptionsProvider.getResourceDescriptions(context.getResourceSet()).getAllResourceDescriptions()) {
			Resource r = resource.getResourceSet().getResource(d.getURI(), true);
			TTCN3GlobalScopeProvider.initExportedObjects(r);
			System.out.println("InitExports: "+r.getURI());
		}
		
		for (int i = 0; i < TTCN3GlobalScopeProvider.RESOURCES.size(); i++) {
			PreAnalyzer p = new PreAnalyzer(TTCN3GlobalScopeProvider.RESOURCES.get(i));
			try {
				p.call();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
			
		TTCN3StatisticsProvider.getInstance().setPreAnalyzingCompleted(true);

	}
}
 No newline at end of file
+11 −1
Original line number Diff line number Diff line
@@ -5,6 +5,7 @@ package de.ugoe.cs.swe.ui;

import org.eclipse.emf.ecore.EcorePackage;
import org.eclipse.ui.plugin.AbstractUIPlugin;
import org.eclipse.xtext.builder.IXtextBuilderParticipant;
import org.eclipse.xtext.builder.nature.NatureAddingEditorCallback;
import org.eclipse.xtext.ide.editor.model.TokenTypeToStringMapper;
import org.eclipse.xtext.ide.editor.syntaxcoloring.AbstractAntlrTokenToAttributeIdMapper;
@@ -16,6 +17,7 @@ import com.google.common.base.Predicate;
import com.google.inject.Binder;
import com.google.inject.name.Names;

import de.ugoe.cs.swe.ui.preferences.TTCN3RootPreferencePage;
import de.ugoe.cs.swe.ui.syntaxcoloring.TTCN3HighlightingCalculator;
import de.ugoe.cs.swe.ui.syntaxcoloring.TTCN3HighlightingConfiguration;
import de.ugoe.cs.swe.ui.syntaxcoloring.TTCN3TokenToAttributeIdMapper;
@@ -26,6 +28,9 @@ import de.ugoe.cs.swe.ui.syntaxcoloring.TTCN3TokenToAttributeIdMapper;
public class TTCN3UiModule extends de.ugoe.cs.swe.ui.AbstractTTCN3UiModule {
	public TTCN3UiModule(AbstractUIPlugin plugin) {
		super(plugin);
	}
	public Class<? extends IXtextBuilderParticipant> bindIXtextBuilderParticipant() {
        return ScopeRebuild.class;
    }
	//@Override
    public Class<? extends IHighlightingConfiguration> bindIHighlightingConfiguration() {
@@ -37,6 +42,11 @@ public class TTCN3UiModule extends de.ugoe.cs.swe.ui.AbstractTTCN3UiModule {
	public Class<? extends ISemanticHighlightingCalculator> bindISemanticHighlightingCalculator() {
		return TTCN3HighlightingCalculator.class;
	}
	
	public Class<? extends org.eclipse.xtext.ui.editor.preferences.LanguageRootPreferencePage> bindLanguageRootPreferencePage() {
		return TTCN3RootPreferencePage.class;
	}

	@Override
    public void configure(Binder binder) {
        super.configure(binder);
+86 −0
Original line number Diff line number Diff line
package de.ugoe.cs.swe.ui.preferences;

import java.io.File;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.LinkedList;
import java.util.List;

import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;

import de.ugoe.cs.swe.TTCN3Configuration.QualityCheckProfile;
import de.ugoe.cs.swe.common.ConfigTools;
import de.ugoe.cs.swe.common.ConfigurationProfile;
import de.ugoe.cs.swe.ui.internal.TTCN3Activator;

/**
 * The Class GFPreferenceInitializer.
 */
public class TTCN3PreferenceInitializer extends AbstractPreferenceInitializer {

	/**
	 * Logger
	 */
	private static final Logger log = Logger.getLogger(TTCN3PreferenceInitializer.class);
	
	
    public static String[] getFieldsOfType(Class<?> target, Class<?> searchType) {

        Field[] fields  = target.getDeclaredFields();
        
        List<String> results = new LinkedList<String>();
        for(Field f:fields){
//        	System.out.println(f.getName() + " -> "+f.getType());
            if(f.getType().equals(searchType)){
                results.add(f.getName());
            }
        }
        return results.toArray(new String[results.size()]);
    }

    public static String[] getBooleans(){
        return getFieldsOfType(QualityCheckProfile.class, boolean.class); 
    }
	
	/* (non-Javadoc)
	 * @see org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer#initializeDefaultPreferences()
	 */
	@Override
	public void initializeDefaultPreferences() {
		System.out.println("init");
		IPreferenceStore store = TTCN3Activator.getInstance().getPreferenceStore();
		
		// Set defaults from environment variables
		try {
			QualityCheckProfile activeProfile = (QualityCheckProfile) ConfigTools.getInstance().getSelectedProfile();
			
			for (String s : getBooleans()) {
				System.out.println(s);
			}
			for (String s : getBooleans()) {
				Method method = activeProfile.getClass().getDeclaredMethod("is"+(""+s.charAt(0)).toUpperCase()+s.substring(1));
				boolean v = (boolean) method.invoke(activeProfile);
				store.setDefault(s, "is"+(""+s.charAt(0)).toUpperCase()+s.substring(1));
				//store.setDefault("checkNoUninitialisedVariables", activeProfile.isCheckNoUninitialisedVariables());
			}
		} catch (Exception e) {
		}
				
		store.setDefault("log-level", "DEBUG");
		
		// Listener for changing logging  level as needed
		store.addPropertyChangeListener(new IPropertyChangeListener() {
			public void propertyChange(PropertyChangeEvent event) {
				if (event.getProperty().equals("log-level")) {
					Level level = Level.toLevel(event.getNewValue().toString(), Level.INFO);
				}
			}
		});
	}

}
 No newline at end of file
+152 −0
Original line number Diff line number Diff line
package de.ugoe.cs.swe.ui.preferences;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import org.eclipse.jface.preference.ComboFieldEditor;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.FontData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.ui.IWorkbench;
import org.eclipse.xtext.ui.editor.preferences.LanguageRootPreferencePage;
import org.eclipse.xtext.ui.editor.preferences.fields.CheckBoxGroupFieldEditor;

import de.ugoe.cs.swe.TTCN3Configuration.QualityCheckProfile;
import de.ugoe.cs.swe.common.ConfigTools;
import de.ugoe.cs.swe.ui.internal.TTCN3Activator;

/**
 * Root preference page
 */
public class TTCN3RootPreferencePage extends LanguageRootPreferencePage {
	
	/**
	 * The Constant PAGE_DESCRIPTION.
	 */
	private static final String PAGE_DESCRIPTION = "Settings for the guideline checks:";
	
	/* (non-Javadoc)
	 * @see org.eclipse.xtext.ui.editor.preferences.LanguageRootPreferencePage#createFieldEditors()
	 */
	@Override
	protected void createFieldEditors() {
		Composite parent = getFieldEditorParent();
		FontData fontData = parent.getFont().getFontData()[0];
		Font fontItalic = new Font(parent.getDisplay(), new FontData(fontData.getName(), fontData.getHeight(), SWT.ITALIC));
		
		
		final IPreferenceStore store = TTCN3Activator.getInstance().getPreferenceStore();
		final QualityCheckProfile activeProfile = (QualityCheckProfile) ConfigTools.getInstance().getSelectedProfile();
		String[] booleans = TTCN3PreferenceInitializer.getBooleans();
		
		//Store profile settings (only needed once)
//		for (String s : booleans) {
//			try {
//				Method method = activeProfile.getClass().getDeclaredMethod("is"+(""+s.charAt(0)).toUpperCase()+s.substring(1));
//				boolean v = (boolean) method.invoke(activeProfile);
//				store.setValue(s, "is"+(""+s.charAt(0)).toUpperCase()+s.substring(1));
//			} catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
//				// TODO Auto-generated catch block
//				e.printStackTrace();
//			}
//			//store.setDefault("checkNoUninitialisedVariables", activeProfile.isCheckNoUninitialisedVariables());
//		}

		//Update profile from stored settings
		for (String s : booleans) {
			try {
				boolean v = store.getBoolean(s);
				Method method = activeProfile.getClass().getDeclaredMethod("set"+(""+s.charAt(0)).toUpperCase()+s.substring(1), Boolean.TYPE);
				method.invoke(activeProfile, v);
			} catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			//store.setDefault("checkNoUninitialisedVariables", activeProfile.isCheckNoUninitialisedVariables());
		}

		
		String[][] settings = new String[booleans.length][2];
		int i = 0;
		//Create settings from profile
		for (String s : booleans) {
			try {
				Method method = activeProfile.getClass().getDeclaredMethod("is"+(""+s.charAt(0)).toUpperCase()+s.substring(1));
				boolean v = (boolean) method.invoke(activeProfile);
				//v = store.getBoolean(s); //from store
				settings[i] = new String[]{s,v+""};
			} catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

			i++;
		}

		addField(new CheckBoxGroupFieldEditor("checks", "Checks:", 2, settings, parent, false) {
			
			@Override
			protected boolean isSelected(String fieldName, String valueToSet) {
//				System.out.println(fieldName +" -> " + valueToSet);
				boolean v = false;
				try {
					//Fill settings from profile
					Method method = activeProfile.getClass().getDeclaredMethod("is"+(""+fieldName.charAt(0)).toUpperCase()+fieldName.substring(1));
					v = (boolean) method.invoke(activeProfile);
					//v = store.getBoolean(fieldName); //from store
				} catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
					e.printStackTrace();
				}
				return v;
			}
			
			@Override
			protected String calculateResult(String[][] settings) {
				for (String[] s : settings) {
//					if (!s[1].equals(s[2])) {
						try {
							//Update settings in profile and in store
							Method method = activeProfile.getClass().getDeclaredMethod("set"+(""+s[0].charAt(0)).toUpperCase()+s[0].substring(1), Boolean.TYPE);
							method.invoke(activeProfile, Boolean.parseBoolean(s[2]));
							store.setValue(s[0],Boolean.parseBoolean(s[2])); //from store
						} catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
							e.printStackTrace();
						}
//					}
				}
				return "true";
			}
		});
		

		
		String[][] entryNamesAndValues = new String[][]{
			// Refer: http://logging.apache.org/log4j/1.2/manual.html
			{"All", "DEBUG"},
			{"Info", "INFO"},
			{"Warnings", "WARN"},
			{"None", "OFF"},
		};
		addField(new ComboFieldEditor("log-level", "Log Le&vel:", entryNamesAndValues, parent));
		new Label(parent, SWT.NULL); // skip cell
		Label label_LogLevel = new Label(parent, SWT.NULL);
		label_LogLevel.setFont(fontItalic);
		label_LogLevel.setText("Only affects console output, not Eclipse's internal log. ");

//		addField(new BooleanFieldEditor(GFPreferences.BUILD_DEPENDENTS, "&Build dependents of changed files", parent));
		
	}
	
	/* (non-Javadoc)
	 * @see org.eclipse.xtext.ui.editor.preferences.AbstractPreferencePage#init(org.eclipse.ui.IWorkbench)
	 */
	@Override
	public void init(IWorkbench workbench) {
		setPreferenceStore(TTCN3Activator.getInstance().getPreferenceStore());
		setDescription(PAGE_DESCRIPTION);
	}
	
}
 No newline at end of file
+3 −1
Original line number Diff line number Diff line
@@ -46,7 +46,9 @@ public class TTCN3HighlightingCalculator implements ISemanticHighlightingCalcula
//	                		}
//	                	}
//	                }
                	if (r.getName().endsWith("KEYWORD")) {
                	if (r.getName().endsWith("KEYWORD") 
                			|| r.getName().equals("MODULE")
                			|| r.getName().equals("ADDRESSVALUE")) {
                		highlightNode( node, TTCN3HighlightingConfiguration.KEYWORD_LAYOUT, acceptor);
                	}
                }
Loading