mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-04-29 19:45:01 +02:00
Bug 244050 - AssertionFailedException in QuickDiff prevents save
This commit is contained in:
parent
507c732870
commit
6184a53e92
1 changed files with 66 additions and 56 deletions
|
@ -934,62 +934,11 @@ public class CDocumentProvider extends TextFileDocumentProvider {
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
protected DocumentProviderOperation createSaveOperation(final Object element, final IDocument document, final boolean overwrite) throws CoreException {
|
protected DocumentProviderOperation createSaveOperation(final Object element, final IDocument document, final boolean overwrite) throws CoreException {
|
||||||
//add a newline to the end of the document (if it is not already present)
|
|
||||||
//-----------------------------------------------------------------------
|
|
||||||
//for people who do not want auto-modification of their files,
|
|
||||||
//this flag will prevent addition of a newline unless the user
|
|
||||||
//explicitly sets the preference thru Window -> Preferences -> C/C++ -> Editor
|
|
||||||
// -> Appearance Tab -> Ensure newline end of file when saving
|
|
||||||
if (PreferenceConstants.getPreferenceStore().getBoolean(
|
|
||||||
PreferenceConstants.ENSURE_NEWLINE_AT_EOF)) {
|
|
||||||
// even if the document is empty, there will be at least one line in
|
|
||||||
// it (the 0th one)
|
|
||||||
int lastLineIndex = document.getNumberOfLines() - 1;
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
// we have to ensure that the length of the last line is 0.
|
performSaveActions(document);
|
||||||
// this will also take care of empty files. empty files have
|
} catch (Exception exc) {
|
||||||
// only one line in them and the length of this one and only
|
// log any exeption, but perform save anyway
|
||||||
// line is 0.
|
CUIPlugin.log(exc);
|
||||||
// Thus we do not need to append an extra line separator to
|
|
||||||
// empty files.
|
|
||||||
int lastLineLength = document.getLineLength(lastLineIndex);
|
|
||||||
if (lastLineLength != 0) {
|
|
||||||
document.replace(document.getLength(), 0,
|
|
||||||
TextUtilities.getDefaultLineDelimiter(document));
|
|
||||||
}
|
|
||||||
} catch (BadLocationException e) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Remove trailing whitespace when saving. Triggered by the flag
|
|
||||||
// in Preferences -> C/C++ -> Editor
|
|
||||||
if (PreferenceConstants.getPreferenceStore().getBoolean(
|
|
||||||
PreferenceConstants.REMOVE_TRAILING_WHITESPACE)) {
|
|
||||||
try {
|
|
||||||
int lineCount= document.getNumberOfLines();
|
|
||||||
for (int i= 0; i < lineCount; i++) {
|
|
||||||
|
|
||||||
IRegion region= document.getLineInformation(i);
|
|
||||||
if (region.getLength() == 0)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
int lineStart= region.getOffset();
|
|
||||||
int lineExclusiveEnd= lineStart + region.getLength();
|
|
||||||
|
|
||||||
// Find the rightmost none-whitespace character
|
|
||||||
int charPos= lineExclusiveEnd - 1;
|
|
||||||
while (charPos >= lineStart && Character.isWhitespace(document.getChar(charPos)))
|
|
||||||
charPos--;
|
|
||||||
|
|
||||||
charPos++;
|
|
||||||
if (charPos < lineExclusiveEnd) {
|
|
||||||
DeleteEdit edit= new DeleteEdit(charPos, lineExclusiveEnd - charPos);
|
|
||||||
edit.apply(document);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (BadLocationException e) {
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
final FileInfo info= getFileInfo(element);
|
final FileInfo info= getFileInfo(element);
|
||||||
|
@ -1021,6 +970,67 @@ public class CDocumentProvider extends TextFileDocumentProvider {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Perform configured document manipulations before save.
|
||||||
|
*
|
||||||
|
* @param document
|
||||||
|
* @throws BadLocationException
|
||||||
|
*/
|
||||||
|
private void performSaveActions(final IDocument document) throws BadLocationException {
|
||||||
|
//add a newline to the end of the document (if it is not already present)
|
||||||
|
//-----------------------------------------------------------------------
|
||||||
|
//for people who do not want auto-modification of their files,
|
||||||
|
//this flag will prevent addition of a newline unless the user
|
||||||
|
//explicitly sets the preference thru Window -> Preferences -> C/C++ -> Editor
|
||||||
|
// -> Appearance Tab -> Ensure newline end of file when saving
|
||||||
|
if (PreferenceConstants.getPreferenceStore().getBoolean(
|
||||||
|
PreferenceConstants.ENSURE_NEWLINE_AT_EOF)) {
|
||||||
|
// even if the document is empty, there will be at least one line in
|
||||||
|
// it (the 0th one)
|
||||||
|
int lastLineIndex = document.getNumberOfLines() - 1;
|
||||||
|
|
||||||
|
// we have to ensure that the length of the last line is 0.
|
||||||
|
// this will also take care of empty files. empty files have
|
||||||
|
// only one line in them and the length of this one and only
|
||||||
|
// line is 0.
|
||||||
|
// Thus we do not need to append an extra line separator to
|
||||||
|
// empty files.
|
||||||
|
int lastLineLength = document.getLineLength(lastLineIndex);
|
||||||
|
if (lastLineLength != 0) {
|
||||||
|
document.replace(document.getLength(), 0,
|
||||||
|
TextUtilities.getDefaultLineDelimiter(document));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remove trailing whitespace when saving. Triggered by the flag
|
||||||
|
// in Preferences -> C/C++ -> Editor
|
||||||
|
if (PreferenceConstants.getPreferenceStore().getBoolean(
|
||||||
|
PreferenceConstants.REMOVE_TRAILING_WHITESPACE)) {
|
||||||
|
|
||||||
|
int lineCount= document.getNumberOfLines();
|
||||||
|
for (int i= 0; i < lineCount; i++) {
|
||||||
|
|
||||||
|
IRegion region= document.getLineInformation(i);
|
||||||
|
if (region.getLength() == 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
int lineStart= region.getOffset();
|
||||||
|
int lineExclusiveEnd= lineStart + region.getLength();
|
||||||
|
|
||||||
|
// Find the rightmost none-whitespace character
|
||||||
|
int charPos= lineExclusiveEnd - 1;
|
||||||
|
while (charPos >= lineStart && Character.isWhitespace(document.getChar(charPos)))
|
||||||
|
charPos--;
|
||||||
|
|
||||||
|
charPos++;
|
||||||
|
if (charPos < lineExclusiveEnd) {
|
||||||
|
DeleteEdit edit= new DeleteEdit(charPos, lineExclusiveEnd - charPos);
|
||||||
|
edit.apply(document);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the preference whether handling temporary problems is enabled.
|
* Returns the preference whether handling temporary problems is enabled.
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Add table
Reference in a new issue