blob: 0e844b794686813a7b0ebe450c702b9be04c0a85 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2017 Martin Kloesch and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* Contributors:
* Martin Kloesch - initial API and implementation
*******************************************************************************/
package org.eclipse.ease.lang.python.ui.completion;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collection;
import org.eclipse.ease.ICompletionContext;
import org.eclipse.ease.IScriptEngine;
import org.eclipse.ease.Logger;
import org.eclipse.ease.lang.python.Activator;
import org.eclipse.ease.lang.python.debugger.ResourceHelper;
import org.eclipse.ease.ui.completion.ICompletionProvider;
import org.eclipse.ease.ui.completion.ScriptCompletionProposal;
/**
* {@link ICompletionProvider} dispatching actual completion calculation to Python.
*/
public class PythonCompletionProviderWrapper implements ICompletionProvider {
/**
* {@link ICompletionProvider} counterpart in Python world.
*/
private ICompletionProvider fPythonProvider = null;
/**
* Sets the Python counterpart for the {@link ICompletionProvider}.
*
* @param provider
* Python {@link ICompletionProvider}.
*/
public void setPythonPprovider(ICompletionProvider provider) {
fPythonProvider = provider;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ease.ui.completion.ICompletionProvider#getProposals(org. eclipse.ease.ICompletionContext)
*/
@Override
public Collection<? extends ScriptCompletionProposal> getProposals(ICompletionContext context) {
if (!isActive(context)) {
return new ArrayList<>();
}
final IScriptEngine engine = context.getScriptEngine();
if (engine != null) {
if (fPythonProvider == null) {
try {
final InputStream stream = ResourceHelper.getResourceStream("org.eclipse.ease.lang.python", "pysrc/autocomplete.py");
// Inject variable first, then instantiate rest via script
engine.setVariable("_pyease_jedi_completion_provider_wrapper", this);
engine.inject(stream);
} catch (final Throwable e) {
Logger.error(Activator.PLUGIN_ID, "Cannot instantiate completion provider in Python world.", e);
return new ArrayList<>();
}
}
// Double check that everything worked
if (fPythonProvider != null) {
return fPythonProvider.getProposals(context);
}
}
return new ArrayList<>();
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ease.ui.completion.ICompletionProvider#isActive(org.eclipse. ease.ICompletionContext)
*/
@Override
public boolean isActive(ICompletionContext context) {
if (fPythonProvider == null) {
return (context.getScriptEngine() != null) && context.getScriptEngine().getDescription().supports("Python");
} else {
return fPythonProvider.isActive(context);
}
}
}