/** * Copyright (c) 2009-2011, The HATS Consortium. All rights reserved. * This file is licensed under the terms of the Modified BSD License. */ package org.absmodels.abs.plugin; import java.io.IOException; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; import org.absmodels.abs.plugin.builder.AbsNature; import org.absmodels.abs.plugin.util.Constants; import org.absmodels.abs.plugin.util.UtilityFunctions; import org.eclipse.core.commands.AbstractHandler; import org.eclipse.core.commands.ExecutionEvent; import org.eclipse.core.commands.ExecutionException; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.preference.IPersistentPreferenceStore; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.swt.widgets.Display; import org.eclipse.ui.handlers.HandlerUtil; import abs.frontend.ast.ASTNode; import abs.frontend.ast.CompilationUnit; import abs.frontend.typechecker.locationtypes.LocationType; import abs.frontend.typechecker.locationtypes.infer.InferMain; import abs.frontend.typechecker.locationtypes.infer.LocationTypeVariable; public class FileAddLocationHandler extends AbstractHandler { @Override public Object execute(ExecutionEvent event) throws ExecutionException { IStructuredSelection selection = (IStructuredSelection) HandlerUtil .getActiveMenuSelection(event); Object firstElement = selection.getFirstElement(); if(firstElement instanceof IFile){ IFile file = (IFile)firstElement; IProject project = file.getProject(); AbsNature nature = UtilityFunctions.getAbsNature(project); if(nature==null) return null; IPersistentPreferenceStore projectStore = nature.getProjectPreferenceStore(); boolean locationTypecheckingEnabled = projectStore.getBoolean(Constants.LOCATION_TYPECHECK); if(!locationTypecheckingEnabled){ MessageDialog.openInformation(Display.getDefault().getActiveShell(), "Locationtypechecking", "Location type checking is disabled. Please enable for this function to work!"); return null; } UtilityFunctions.saveEditor(file, false); Map<LocationTypeVariable, LocationType> locationTypeInferrerResult = nature.getLocationTypeInferrerResult(); if(locationTypeInferrerResult!=null){ Map<LocationTypeVariable, LocationType> filteredResults = new HashMap<LocationTypeVariable, LocationType>(); ASTNode<?> node; CompilationUnit cu; for(Entry<LocationTypeVariable, LocationType> entry : locationTypeInferrerResult.entrySet()){ node = entry.getKey().getNode(); if(node==null) continue; cu = node.getCompilationUnit(); if(cu==null) continue; if(file.getLocation().toFile().getAbsolutePath().equals(cu.getFileName())){ filteredResults.put(entry.getKey(),entry.getValue()); } } InferMain inferMain = new InferMain(); String commandId = event.getCommand().getId(); if("org.abs-models.abs.plugin.fileaddalllocations".equals(commandId)){ inferMain.setConfig(InferMain.Config.values()); } else if("org.abs-models.abs.plugin.fileaddclasslocations".equals(commandId)){ inferMain.setConfig(InferMain.Config.CLASSES); } else if("org.abs-models.abs.plugin.fileaddfieldlocations".equals(commandId)){ inferMain.setConfig(InferMain.Config.FIELDS); } else if("org.abs-models.abs.plugin.fileaddfunctionlocations".equals(commandId)){ inferMain.setConfig(InferMain.Config.FUNCTIONS); } else if("org.abs-models.abs.plugin.fileaddinterfacelocations".equals(commandId)){ inferMain.setConfig(InferMain.Config.INTERFACES); } try { inferMain.writeInferenceResultsBack(filteredResults); try { file.refreshLocal(IResource.DEPTH_INFINITE, null); } catch (CoreException e) { Activator.logException(e); } } catch (IOException e) { MessageDialog.openError(Display.getDefault().getActiveShell(), "Error while inserting locations", "An error occurred while inserting locations!\n"+e.getLocalizedMessage()); } } } return null; } }