mirror of
https://github.com/python/cpython.git
synced 2024-11-28 20:33:54 +08:00
Add checking for inconsistent tab usage
This commit is contained in:
parent
e77a992a0d
commit
926f13a081
@ -125,6 +125,11 @@ tok_new()
|
||||
tok->prompt = tok->nextprompt = NULL;
|
||||
tok->lineno = 0;
|
||||
tok->level = 0;
|
||||
tok->filename = NULL;
|
||||
tok->altwarning = 0;
|
||||
tok->alterror = 0;
|
||||
tok->alttabsize = 1;
|
||||
tok->altindstack[0] = 0;
|
||||
return tok;
|
||||
}
|
||||
|
||||
@ -422,6 +427,24 @@ PyToken_TwoChars(c1, c2)
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
indenterror(tok)
|
||||
struct tok_state *tok;
|
||||
{
|
||||
if (tok->alterror) {
|
||||
tok->done = E_INDENT;
|
||||
tok->cur = tok->inp;
|
||||
return 1;
|
||||
}
|
||||
if (tok->altwarning) {
|
||||
fprintf(stderr, "%s: inconsistent tab/space usage\n",
|
||||
tok->filename);
|
||||
tok->altwarning = 0;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/* Get next token, after space stripping etc. */
|
||||
|
||||
int
|
||||
@ -440,15 +463,19 @@ PyTokenizer_Get(tok, p_start, p_end)
|
||||
/* Get indentation level */
|
||||
if (tok->atbol) {
|
||||
register int col = 0;
|
||||
register int altcol = 0;
|
||||
tok->atbol = 0;
|
||||
for (;;) {
|
||||
c = tok_nextc(tok);
|
||||
if (c == ' ')
|
||||
col++;
|
||||
else if (c == '\t')
|
||||
col++, altcol++;
|
||||
else if (c == '\t') {
|
||||
col = (col/tok->tabsize + 1) * tok->tabsize;
|
||||
altcol = (altcol/tok->alttabsize + 1)
|
||||
* tok->alttabsize;
|
||||
}
|
||||
else if (c == '\014') /* Control-L (formfeed) */
|
||||
col = 0; /* For Emacs users */
|
||||
col = altcol = 0; /* For Emacs users */
|
||||
else
|
||||
break;
|
||||
}
|
||||
@ -469,6 +496,10 @@ PyTokenizer_Get(tok, p_start, p_end)
|
||||
if (!blankline && tok->level == 0) {
|
||||
if (col == tok->indstack[tok->indent]) {
|
||||
/* No change */
|
||||
if (altcol != tok->altindstack[tok->indent]) {
|
||||
if (indenterror(tok))
|
||||
return ERRORTOKEN;
|
||||
}
|
||||
}
|
||||
else if (col > tok->indstack[tok->indent]) {
|
||||
/* Indent -- always one */
|
||||
@ -478,8 +509,13 @@ PyTokenizer_Get(tok, p_start, p_end)
|
||||
tok->cur = tok->inp;
|
||||
return ERRORTOKEN;
|
||||
}
|
||||
if (altcol <= tok->altindstack[tok->indent]) {
|
||||
if (indenterror(tok))
|
||||
return ERRORTOKEN;
|
||||
}
|
||||
tok->pendin++;
|
||||
tok->indstack[++tok->indent] = col;
|
||||
tok->altindstack[tok->indent] = altcol;
|
||||
}
|
||||
else /* col < tok->indstack[tok->indent] */ {
|
||||
/* Dedent -- any number, must be consistent */
|
||||
@ -495,6 +531,10 @@ PyTokenizer_Get(tok, p_start, p_end)
|
||||
tok->cur = tok->inp;
|
||||
return ERRORTOKEN;
|
||||
}
|
||||
if (altcol != tok->altindstack[tok->indent]) {
|
||||
if (indenterror(tok))
|
||||
return ERRORTOKEN;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -62,6 +62,12 @@ struct tok_state {
|
||||
int lineno; /* Current line number */
|
||||
int level; /* () [] {} Parentheses nesting level */
|
||||
/* Used to allow free continuations inside them */
|
||||
/* Stuff for checking on different tab sizes */
|
||||
char *filename; /* For error messages */
|
||||
int altwarning; /* Issue warning if alternate tabs don't match */
|
||||
int alterror; /* Issue error if alternate tabs don't match */
|
||||
int alttabsize; /* Alternate tab spacing */
|
||||
int altindstack[MAXINDENT]; /* Stack of alternate indents */
|
||||
};
|
||||
|
||||
extern struct tok_state *PyTokenizer_FromString Py_PROTO((char *));
|
||||
|
Loading…
Reference in New Issue
Block a user