mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-04-29 19:45:01 +02:00
Fix for 222069: CSourceHover popup doesn't work after changing file
This commit is contained in:
parent
3320c11eae
commit
3b9d0a9587
5 changed files with 83 additions and 30 deletions
|
@ -1,12 +1,12 @@
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Copyright (c) 2007 Wind River Systems, Inc. and others. All rights reserved.
|
* Copyright (c) 2007, 2008 Wind River Systems, Inc. and others. All rights reserved.
|
||||||
* This program and the accompanying materials are made available under the
|
* This program and the accompanying materials are made available under the
|
||||||
* terms of the Eclipse Public License v1.0 which accompanies this distribution,
|
* terms of the Eclipse Public License v1.0 which accompanies this distribution,
|
||||||
* and is available at http://www.eclipse.org/legal/epl-v10.html
|
* and is available at http://www.eclipse.org/legal/epl-v10.html
|
||||||
*
|
*
|
||||||
* Contributors:
|
* Contributors:
|
||||||
* Anton Leherbauer (Wind River Systems) - initial API and implementation
|
* Anton Leherbauer (Wind River Systems) - initial API and implementation
|
||||||
* Markus Schorn (Wind River Systems)
|
* Markus Schorn (Wind River Systems)
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
package org.eclipse.cdt.internal.core.model;
|
package org.eclipse.cdt.internal.core.model;
|
||||||
|
|
||||||
|
@ -40,7 +40,7 @@ public class ASTCache {
|
||||||
/** Full parse mode (no PDOM) */
|
/** Full parse mode (no PDOM) */
|
||||||
public static int PARSE_MODE_FULL= ITranslationUnit.AST_CONFIGURE_USING_SOURCE_CONTEXT;
|
public static int PARSE_MODE_FULL= ITranslationUnit.AST_CONFIGURE_USING_SOURCE_CONTEXT;
|
||||||
/** Fast parse mode (use PDOM) */
|
/** Fast parse mode (use PDOM) */
|
||||||
public static int PARSE_MODE_FAST= ITranslationUnit.AST_SKIP_INDEXED_HEADERS | ITranslationUnit.AST_CONFIGURE_USING_SOURCE_CONTEXT;
|
public static int PARSE_MODE_FAST= ITranslationUnit.AST_SKIP_ALL_HEADERS | ITranslationUnit.AST_CONFIGURE_USING_SOURCE_CONTEXT;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Do something with an AST.
|
* Do something with an AST.
|
||||||
|
@ -71,7 +71,7 @@ public class ASTCache {
|
||||||
* write access afterwards.
|
* write access afterwards.
|
||||||
*/
|
*/
|
||||||
private long fLastWriteOnIndex;
|
private long fLastWriteOnIndex;
|
||||||
/** Inidicates whether the AST is currenty being computed */
|
/** Indicates whether the AST is currently being computed */
|
||||||
private boolean fIsReconciling;
|
private boolean fIsReconciling;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Copyright (c) 2002, 2007 QNX Software Systems and others.
|
* Copyright (c) 2002, 2008 QNX Software Systems and others.
|
||||||
* All rights reserved. This program and the accompanying materials
|
* All rights reserved. This program and the accompanying materials
|
||||||
* are made available under the terms of the Eclipse Public License v1.0
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
* which accompanies this distribution, and is available at
|
* which accompanies this distribution, and is available at
|
||||||
|
@ -27,6 +27,10 @@ public final class CHoverMessages extends NLS {
|
||||||
public static String CMacroExpansionControl_title_fullyExpanded;
|
public static String CMacroExpansionControl_title_fullyExpanded;
|
||||||
public static String CMacroExpansionControl_title_macroExpansion;
|
public static String CMacroExpansionControl_title_macroExpansion;
|
||||||
public static String CMacroExpansionControl_title_original;
|
public static String CMacroExpansionControl_title_original;
|
||||||
|
|
||||||
|
public static String CMacroExpansionInput_jobTitle;
|
||||||
|
|
||||||
|
public static String CSourceHover_jobTitle;
|
||||||
|
|
||||||
static {
|
static {
|
||||||
NLS.initializeMessages(BUNDLE_NAME, CHoverMessages.class);
|
NLS.initializeMessages(BUNDLE_NAME, CHoverMessages.class);
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
###############################################################################
|
###############################################################################
|
||||||
# Copyright (c) 2000, 2007 IBM Corporation and others.
|
# Copyright (c) 2000, 2008 IBM Corporation and others.
|
||||||
# All rights reserved. This program and the accompanying materials
|
# All rights reserved. This program and the accompanying materials
|
||||||
# are made available under the terms of the Eclipse Public License v1.0
|
# are made available under the terms of the Eclipse Public License v1.0
|
||||||
# which accompanies this distribution, and is available at
|
# which accompanies this distribution, and is available at
|
||||||
|
@ -15,3 +15,7 @@ CMacroExpansionControl_title_expansion=Expansion \#{0} of {1}
|
||||||
CMacroExpansionControl_title_fullyExpanded=Fully Expanded
|
CMacroExpansionControl_title_fullyExpanded=Fully Expanded
|
||||||
CMacroExpansionControl_title_macroExpansion=Macro Expansion
|
CMacroExpansionControl_title_macroExpansion=Macro Expansion
|
||||||
CMacroExpansionControl_title_original=Original
|
CMacroExpansionControl_title_original=Original
|
||||||
|
|
||||||
|
CMacroExpansionInput_jobTitle= Computing Macro Expansion
|
||||||
|
|
||||||
|
CSourceHover_jobTitle= Computing Source
|
||||||
|
|
|
@ -17,8 +17,9 @@ import java.util.List;
|
||||||
|
|
||||||
import org.eclipse.core.runtime.IProgressMonitor;
|
import org.eclipse.core.runtime.IProgressMonitor;
|
||||||
import org.eclipse.core.runtime.IStatus;
|
import org.eclipse.core.runtime.IStatus;
|
||||||
import org.eclipse.core.runtime.NullProgressMonitor;
|
|
||||||
import org.eclipse.core.runtime.Status;
|
import org.eclipse.core.runtime.Status;
|
||||||
|
import org.eclipse.core.runtime.jobs.ISchedulingRule;
|
||||||
|
import org.eclipse.core.runtime.jobs.Job;
|
||||||
import org.eclipse.jface.text.BadLocationException;
|
import org.eclipse.jface.text.BadLocationException;
|
||||||
import org.eclipse.jface.text.IDocument;
|
import org.eclipse.jface.text.IDocument;
|
||||||
import org.eclipse.jface.text.IRegion;
|
import org.eclipse.jface.text.IRegion;
|
||||||
|
@ -48,7 +49,6 @@ import org.eclipse.cdt.ui.IWorkingCopyManager;
|
||||||
import org.eclipse.cdt.internal.core.model.ASTCache.ASTRunnable;
|
import org.eclipse.cdt.internal.core.model.ASTCache.ASTRunnable;
|
||||||
|
|
||||||
import org.eclipse.cdt.internal.ui.editor.ASTProvider;
|
import org.eclipse.cdt.internal.ui.editor.ASTProvider;
|
||||||
import org.eclipse.cdt.internal.ui.editor.ASTProvider.WAIT_FLAG;
|
|
||||||
import org.eclipse.cdt.internal.ui.text.CHeuristicScanner;
|
import org.eclipse.cdt.internal.ui.text.CHeuristicScanner;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -58,6 +58,16 @@ import org.eclipse.cdt.internal.ui.text.CHeuristicScanner;
|
||||||
*/
|
*/
|
||||||
public class CMacroExpansionInput {
|
public class CMacroExpansionInput {
|
||||||
|
|
||||||
|
private static class SingletonRule implements ISchedulingRule {
|
||||||
|
public static final ISchedulingRule INSTANCE = new SingletonRule();
|
||||||
|
public boolean contains(ISchedulingRule rule) {
|
||||||
|
return rule == this;
|
||||||
|
}
|
||||||
|
public boolean isConflicting(ISchedulingRule rule) {
|
||||||
|
return rule == this;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Computes the expansion region for a selection.
|
* Computes the expansion region for a selection.
|
||||||
*/
|
*/
|
||||||
|
@ -199,8 +209,6 @@ public class CMacroExpansionInput {
|
||||||
}
|
}
|
||||||
|
|
||||||
MacroExpansionExplorer fExplorer;
|
MacroExpansionExplorer fExplorer;
|
||||||
IDocument fDocument;
|
|
||||||
IRegion fRegion;
|
|
||||||
boolean fStartWithFullExpansion= true;
|
boolean fStartWithFullExpansion= true;
|
||||||
|
|
||||||
private CMacroExpansionInput() {
|
private CMacroExpansionInput() {
|
||||||
|
@ -226,32 +234,41 @@ public class CMacroExpansionInput {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
IProgressMonitor monitor= new NullProgressMonitor();
|
|
||||||
ExpansionRegionComputer computer= new ExpansionRegionComputer(tu, textRegion, force);
|
ExpansionRegionComputer computer= new ExpansionRegionComputer(tu, textRegion, force);
|
||||||
final WAIT_FLAG waitFlag = force ? ASTProvider.WAIT_ACTIVE_ONLY : ASTProvider.WAIT_NO;
|
doRunOnAST(computer, tu, force);
|
||||||
IStatus status= ASTProvider.getASTProvider().runOnAST(tu, waitFlag, monitor, computer);
|
|
||||||
if (!status.isOK()) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
IRegion region= computer.getExpansionRegion();
|
|
||||||
if (region == null) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
MacroExpansionExplorer explorer= computer.getMacroExpansionExplorer();
|
MacroExpansionExplorer explorer= computer.getMacroExpansionExplorer();
|
||||||
if (explorer == null) {
|
if (explorer == null) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
ITextEditor textEditor= (ITextEditor)editor;
|
|
||||||
IDocument document= textEditor.getDocumentProvider().getDocument(editorInput);
|
|
||||||
|
|
||||||
CMacroExpansionInput input= new CMacroExpansionInput();
|
CMacroExpansionInput input= new CMacroExpansionInput();
|
||||||
input.fExplorer= explorer;
|
input.fExplorer= explorer;
|
||||||
input.fDocument= document;
|
|
||||||
input.fRegion= region;
|
|
||||||
|
|
||||||
return input;
|
return input;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static void doRunOnAST(final ASTRunnable runnable, final ITranslationUnit tu, boolean force) {
|
||||||
|
Job job= new Job(CHoverMessages.CMacroExpansionInput_jobTitle) {
|
||||||
|
@Override
|
||||||
|
protected IStatus run(IProgressMonitor monitor) {
|
||||||
|
return ASTProvider.getASTProvider().runOnAST(tu, ASTProvider.WAIT_ACTIVE_ONLY, monitor, runnable);
|
||||||
|
}};
|
||||||
|
|
||||||
|
// If the hover thread is interrupted this might have negative
|
||||||
|
// effects on the index - see http://bugs.eclipse.org/219834
|
||||||
|
// Therefore we schedule a job to decouple the parsing from this thread.
|
||||||
|
job.setPriority(force ? Job.INTERACTIVE : Job.DECORATE);
|
||||||
|
job.setSystem(true);
|
||||||
|
job.setRule(SingletonRule.INSTANCE);
|
||||||
|
job.schedule();
|
||||||
|
try {
|
||||||
|
job.join();
|
||||||
|
} catch (InterruptedException exc) {
|
||||||
|
job.cancel();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Expand the given text region to span complete lines of the document and
|
* Expand the given text region to span complete lines of the document and
|
||||||
* add a number of lines before and after the region.
|
* add a number of lines before and after the region.
|
||||||
|
|
|
@ -27,6 +27,8 @@ import org.eclipse.core.runtime.IStatus;
|
||||||
import org.eclipse.core.runtime.NullProgressMonitor;
|
import org.eclipse.core.runtime.NullProgressMonitor;
|
||||||
import org.eclipse.core.runtime.Path;
|
import org.eclipse.core.runtime.Path;
|
||||||
import org.eclipse.core.runtime.Status;
|
import org.eclipse.core.runtime.Status;
|
||||||
|
import org.eclipse.core.runtime.jobs.ISchedulingRule;
|
||||||
|
import org.eclipse.core.runtime.jobs.Job;
|
||||||
import org.eclipse.jface.text.BadLocationException;
|
import org.eclipse.jface.text.BadLocationException;
|
||||||
import org.eclipse.jface.text.Document;
|
import org.eclipse.jface.text.Document;
|
||||||
import org.eclipse.jface.text.IDocument;
|
import org.eclipse.jface.text.IDocument;
|
||||||
|
@ -101,6 +103,16 @@ public class CSourceHover extends AbstractCEditorTextHover implements ITextHover
|
||||||
|
|
||||||
private static final boolean DEBUG = false;
|
private static final boolean DEBUG = false;
|
||||||
|
|
||||||
|
private static class SingletonRule implements ISchedulingRule {
|
||||||
|
public static final ISchedulingRule INSTANCE = new SingletonRule();
|
||||||
|
public boolean contains(ISchedulingRule rule) {
|
||||||
|
return rule == this;
|
||||||
|
}
|
||||||
|
public boolean isConflicting(ISchedulingRule rule) {
|
||||||
|
return rule == this;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Computes the source location for a given identifier.
|
* Computes the source location for a given identifier.
|
||||||
*/
|
*/
|
||||||
|
@ -787,10 +799,26 @@ public class CSourceHover extends AbstractCEditorTextHover implements ITextHover
|
||||||
return source.substring(i);
|
return source.substring(i);
|
||||||
}
|
}
|
||||||
|
|
||||||
private String searchInIndex(ITranslationUnit tUnit, IRegion textRegion) {
|
private String searchInIndex(final ITranslationUnit tUnit, IRegion textRegion) {
|
||||||
IProgressMonitor monitor= new NullProgressMonitor();
|
final ComputeSourceRunnable computer= new ComputeSourceRunnable(tUnit, textRegion);
|
||||||
ComputeSourceRunnable computer= new ComputeSourceRunnable(tUnit, textRegion);
|
Job job= new Job(CHoverMessages.CSourceHover_jobTitle) {
|
||||||
ASTProvider.getASTProvider().runOnAST(tUnit, ASTProvider.WAIT_NO, monitor, computer);
|
protected IStatus run(IProgressMonitor monitor) {
|
||||||
|
return ASTProvider.getASTProvider().runOnAST(tUnit, ASTProvider.WAIT_ACTIVE_ONLY, monitor, computer);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
// If the hover thread is interrupted this might have negative
|
||||||
|
// effects on the index - see http://bugs.eclipse.org/219834
|
||||||
|
// Therefore we schedule a job to decouple the parsing from this thread.
|
||||||
|
job.setPriority(Job.DECORATE);
|
||||||
|
job.setSystem(true);
|
||||||
|
job.setRule(SingletonRule.INSTANCE);
|
||||||
|
job.schedule();
|
||||||
|
try {
|
||||||
|
job.join();
|
||||||
|
} catch (InterruptedException exc) {
|
||||||
|
job.cancel();
|
||||||
|
return null;
|
||||||
|
}
|
||||||
return computer.getSource();
|
return computer.getSource();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue