Fix empty line handling in line directive callback.
The current line number for the #line directive should be passed in as parameter to the line directive callback. Without it, we don't know how many empty lines we should output.
This commit is contained in:
parent
5cbc990a0a
commit
46ea5396ef
@ -1,5 +1,4 @@
|
||||
#version 310 es
|
||||
|
||||
#line 1 2
|
||||
#pragma something
|
||||
void main(){ }
|
||||
|
||||
@ -2,20 +2,36 @@
|
||||
|
||||
#line 2
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#line 10
|
||||
|
||||
|
||||
#line 2
|
||||
|
||||
#line 0
|
||||
|
||||
|
||||
|
||||
#line 4
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#line 8
|
||||
|
||||
void main(){
|
||||
gl_Position = vec4(10);
|
||||
}
|
||||
|
||||
#line 8 4
|
||||
|
||||
|
||||
|
||||
|
||||
#line 12 3
|
||||
|
||||
#line 1
|
||||
|
||||
@ -5254,10 +5254,10 @@ void TParseContext::notifyErrorDirective(int line, const char* error_message)
|
||||
}
|
||||
}
|
||||
|
||||
void TParseContext::notifyLineDirective(int line, bool has_source, int source)
|
||||
void TParseContext::notifyLineDirective(int curLineNo, int newLineNo, bool hasSource, int sourceNum)
|
||||
{
|
||||
if (lineCallback) {
|
||||
lineCallback(line, has_source, source);
|
||||
lineCallback(curLineNo, newLineNo, hasSource, sourceNum);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -216,7 +216,7 @@ public:
|
||||
|
||||
void notifyVersion(int line, int version, const char* type_string);
|
||||
void notifyErrorDirective(int line, const char* error_message);
|
||||
void notifyLineDirective(int line, bool has_source, int source);
|
||||
void notifyLineDirective(int curLineNo, int newLineNo, bool hasSource, int sourceNum);
|
||||
|
||||
// The following are implemented in Versions.cpp to localize version/profile/stage/extensions control
|
||||
void initializeExtensionBehavior();
|
||||
@ -236,7 +236,7 @@ public:
|
||||
|
||||
void setVersionCallback(const std::function<void(int, int, const char*)>& func) { versionCallback = func; }
|
||||
void setPragmaCallback(const std::function<void(int, const TVector<TString>&)>& func) { pragmaCallback = func; }
|
||||
void setLineCallback(const std::function<void(int, bool, int)>& func) { lineCallback = func; }
|
||||
void setLineCallback(const std::function<void(int, int, bool, int)>& func) { lineCallback = func; }
|
||||
void setExtensionCallback(const std::function<void(int, const char*, const char*)>& func) { extensionCallback = func; }
|
||||
void setErrorCallback(const std::function<void(int, const char*)>& func) { errorCallback = func; }
|
||||
|
||||
@ -347,7 +347,7 @@ protected:
|
||||
|
||||
// These, if set, will be called when a line, pragma ... is preprocessed.
|
||||
// They will be called with any parameters to the original directive.
|
||||
std::function<void(int, bool, int)> lineCallback;
|
||||
std::function<void(int, int, bool, int)> lineCallback;
|
||||
std::function<void(int, const TVector<TString>&)> pragmaCallback;
|
||||
std::function<void(int, int, const char*)> versionCallback;
|
||||
std::function<void(int, const char*, const char*)> extensionCallback;
|
||||
|
||||
@ -639,12 +639,10 @@ struct DoPreprocessing {
|
||||
adjustLine(line);
|
||||
outputStream << "#extension " << extension << " : " << behavior;
|
||||
});
|
||||
parseContext.setLineCallback([&lastLine, &outputStream, &parseContext](
|
||||
int newLineNo, bool hasSource, int sourceNum) {
|
||||
parseContext.setLineCallback([&adjustLine, &lastLine, &outputStream, &parseContext](
|
||||
int curLineNo, int newLineNo, bool hasSource, int sourceNum) {
|
||||
// SourceNum is the number of the source-string that is being parsed.
|
||||
if (lastLine != -1) {
|
||||
outputStream << std::endl;
|
||||
}
|
||||
adjustLine(curLineNo);
|
||||
outputStream << "#line " << newLineNo;
|
||||
if (hasSource) {
|
||||
outputStream << " " << sourceNum;
|
||||
|
||||
@ -624,6 +624,7 @@ int TPpContext::CPPline(TPpToken* ppToken)
|
||||
// "#line line source-string-number"
|
||||
|
||||
int token = scanToken(ppToken);
|
||||
const int directiveLoc = ppToken->loc.line;
|
||||
if (token == '\n') {
|
||||
parseContext.error(ppToken->loc, "must by followed by an integral literal", "#line", "");
|
||||
return token;
|
||||
@ -653,7 +654,7 @@ int TPpContext::CPPline(TPpToken* ppToken)
|
||||
}
|
||||
}
|
||||
if (!fileErr && !lineErr) {
|
||||
parseContext.notifyLineDirective(lineToken, hasFile, fileRes);
|
||||
parseContext.notifyLineDirective(directiveLoc, lineToken, hasFile, fileRes);
|
||||
}
|
||||
token = extraTokenCheck(lineAtom, ppToken, token);
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user