O motor emite diagnósticos identificados por códigos PP####.
| Código | Severidade | Descrição |
|---|---|---|
PP0001 |
Erro | #include não encontrado |
PP0002 |
Erro | native com corpo {} |
PP0003 |
Erro | forward com corpo {} |
PP0004 |
Aviso | public/stock/static sem corpo {} |
PP0005 |
Aviso¹ | Variável global declarada e não utilizada |
PP0006 |
Aviso¹ | Função stock/static não utilizada |
PP0007 |
Aviso | Uso de símbolo marcado com #pragma deprecated |
PP0008 |
Aviso | #include precedido de #pragma deprecated |
PP0009 |
Hint¹ | Parâmetro de função declarado e não utilizado |
PP0010 |
Aviso | Função chamada não declarada em nenhum include ativo |
PP0011 |
Hint¹ | #define declarado mas não utilizado |
PP0012 |
Hint | #include cujos símbolos (diretos e transitivos) não são utilizados |
PP0013 |
Hint | #tryinclude não resolvido (informativo) |
PP0014 |
Hint | native declarada mas nunca chamada |
PP0015 |
Hint | forward declarado mas nunca chamado |
PP0016 |
Aviso¹ | Função sem keyword declarada mas nunca chamada |
PP0017 |
Aviso | Indentação inconsistente dentro de um bloco |
PP0018 |
Hint | Nome de identificador pobre (assistente de nomes; desligado por padrão) |
PP0019 |
Aviso | #pragma desconhecido ou malformado |
O compilador rejeita uma diretiva que não conheça (erro 207), mas só na compilação. Este diagnóstico antecipa o erro e oferece a correção.
Cobre dois casos:
-
Nome não reconhecido — comparado com a lista do compilador (
sc2.c); quando há uma diretiva próxima, é sugerida:#pragma deprected→#pragma deprecated. -
Mensagem de
deprecatedentre aspas — a diretiva toma o resto da linha como texto livre, sem aspas:#pragma deprecated Use BanPlayerFor // correto #pragma deprecated "Use BanPlayerFor" // as aspas entram na mensagem
Aspas no meio do texto são literais legítimas e não são sinalizadas.
Nos dois casos há quick fix.
Onde a correção é determinística, o diagnóstico vem com uma ação aplicável por clique (Ctrl+. / lâmpada):
| Código | Ação |
|---|---|
PP0002, PP0003 |
Remover o corpo { … } que o compilador não aceita em native/forward |
PP0004 |
Adicionar corpo vazio, ou converter public/stock em forward |
PP0005, PP0006, PP0009, PP0016 |
Remover a declaração não utilizada |
PP0010 |
Trocar por um símbolo conhecido de nome parecido (erro de digitação) |
PP0011, PP0012 |
Remover o #define / #include não utilizado |
PP0017 |
Reindentar a linha, usando o estilo de formatação configurado |
PP0018 |
Renomear para o estilo configurado |
PP0019 |
Corrigir o nome da diretiva, ou remover as aspas da mensagem |
Os demais não têm correção automática: PP0001 e PP0013 dependem de onde o arquivo está; PP0007 e PP0008 dependem do que usar no lugar (que só quem escreveu sabe); PP0014 e PP0015 são informativos — remover uma native ou um forward de uma include quebraria quem a consome.
As remoções por "não utilizado" não são oferecidas em arquivos .inc, onde o símbolo costuma existir justamente para quem inclui o arquivo. A remoção de corpo ilegal (PP0002/PP0003), por ser erro de sintaxe, vale em qualquer arquivo.
¹ Marcados com
DiagnosticTag::UNNECESSARY— o editor exibe o símbolo desbotado além do sublinhado diagnóstico.
Emitido quando um #include <token> ou #include "caminho" não é resolvido em nenhum dos includePaths configurados. A mensagem inclui os caminhos pesquisados. Verifique a chave includePaths em .pawnpro/config.json.
native e forward são declarações sem implementação. Um bloco {} após a assinatura é erro estrutural.
public, stock e static requerem implementação. Uma declaração sem {} indica erro de digitação ou declaração incompleta.
- PP0005 cobre variáveis globais (
new variavel;). - PP0006 cobre funções
stockestatic. - Ambos usam a flag
unnecessary, que faz o editor exibir o símbolo com texto desbotado. - Stocks em
.incsão silenciados por padrão. Useanalysis.warnUnusedInInc: truepara habilitá-los. - O motor verifica o workspace inteiro — um símbolo usado em qualquer arquivo
.pwn/.incdo projeto não dispara o aviso.
Use a diretiva do compilador, #pragma deprecated, na linha anterior à declaração — ela marca o próximo símbolo declarado:
#pragma deprecated Use BanPlayerFor em vez desta
stock BanTemporario(playerid, seconds) { }O texto após a diretiva é opcional e, quando presente, é anexado ao aviso — normalmente diz o que usar no lugar.
- PP0007 é emitido na própria declaração depreciada (hint visual com strikethrough) e em cada uso posterior.
- Cobre:
native,stock,public,forward,static,#definee variáveis globais. - Depreciar um
forwardmarca automaticamente opublicpar (e vice-versa), incluindo quando definidos em includes diferentes. - PP0008 é emitido na linha do
#includedepreciado; todos os símbolos daquele arquivo passam a emitir PP0007.
Emitido como Hint para evitar ruído em callbacks com assinatura fixa definida pelo SA-MP/OMP SDK. Parâmetros com prefixo _ e parâmetros variádicos são ignorados (convenção intencional).
O motor verifica que cada chamada de função possui uma declaração correspondente em algum dos includes transitivos, no próprio arquivo, ou no SDK configurado. Não é emitido em arquivos .inc.
Emitido como Hint. Defines de biblioteca em .inc sem uso local são comuns — o nível Hint evita falsos alertas.
Emitido como Hint quando nenhum símbolo (função, macro ou variável) do include e de seus sub-includes transitivos é referenciado no arquivo atual. Um include que re-exporta símbolos de sub-includes não dispara este aviso enquanto qualquer um desses símbolos for usado. Não emitido se o include não foi resolvido (PP0001 já cobre esse caso). Não emitido em .inc.
#tryinclude é uma diretiva opcional por definição. O motor emite Hint apenas para informar que o arquivo não foi encontrado, sem impedir a análise.
- PP0014 cobre
nativedeclaradas no arquivo mas nunca invocadas em nenhum arquivo do workspace. - PP0015 cobre
forwardno mesmo critério. - Emitidos como Hint — declarações de biblioteca são comuns em
.ince não devem gerar ruído.
Funções globais sem public/stock/static (callbacks registrados externamente, por exemplo) que nunca aparecem chamadas no workspace. Emitido como Aviso com flag unnecessary.
Emitido quando a indentação de uma linha dentro de um bloco diverge do padrão detectado no arquivo (spaces vs tabs, ou tamanho de tab diferente). O motor respeita #pragma tabsize N quando presente em qualquer include do workspace.