Pergunta

Eu sou louco por coloração de sintaxe, onde diferentes elementos de código-fonte são exibidos em cores diferentes. Hoje em dia, boa coloração é lá em cima com recuo adequada quando se trata de minha capacidade de ler o código.

Dando uma olhada sob Tools/Customize/Fonts and Colors, eu posso ver que em alguns casos não é bom granularidade; você pode dar cores diferentes para cordas, e strings literais, por exemplo.

Mas aqui é uma linha típica de código C #:

Controls.Add(combo);

Agora Controls, Add, and combo são todos diferentes tipos de coisas, mas todos eles são processados ??na mesma cor, porque eles são todos apenas 'identificadores'.

Na verdade, há uma maneira de obter mais granularidade do que isso? Pelo menos métodos de cor diferente do que objetos?

Foi útil?

Solução

Alguns pensamentos.

Em primeiro lugar, os recursos são "não implementado" por padrão. Para que um recurso a ser implementado, alguém tem que pensar no recurso. Então nós temos que projetá-lo, especificá-lo, implementá-lo, testá-lo, documentá-lo, encontrar um veículo de transporte para ele, e obtê-lo para fora da porta. Se qualquer uma dessas coisas não acontecer, você não obter o recurso. Tanto quanto eu sei, nenhuma dessas coisas aconteceram para este recurso.

Em segundo lugar, os recursos são priorizados com base em seus benefícios líquidos - ou seja, o seu benefício total para os nossos clientes, menos nossos custos totais em implementá-las. Há muito reais "custos de oportunidade" em jogo aqui. Cada característica que fazemos implementar é dezenas de recursos que não temos orçamento para. Assim, apresenta não só tem que valer a pena o trabalho para fazê-las acontecer, eles têm que ser mais benéfico do que qualquer um dos milhares de recursos que temos em nossas listas de pedido de recurso. Isso é uma barra alta para alcançar; a maioria dos recursos nunca alcançá-lo.

Para explicar o meu terceiro ponto que você precisa saber um pouco sobre como as línguas são processados. Começamos tomando o código fonte e "léxico"-lo em "tokens" - palavras. Neste ponto, nós saber se cada personagem é uma parte de uma série, cadeia, palavra-chave, identificador, comentário, pré-processador diretiva, e assim por diante. Lexing é incrivelmente rápido ; que facilmente pode re-Lex um arquivo entre teclas.

Em seguida, levar a série de tokens e "parse"-los em uma "árvore de sintaxe abstrata". Isto determina que partes do código são classes, expressões, declarações de variáveis ??locais, nomes, atribuições, o que for. Análise também é rápido, mas não tão rápido quanto léxico. Fazemos alguns truques, como pular analisar os corpos de método até que alguém está realmente olhando para eles.

Finalmente, tomamos a árvore de sintaxe abstrata e fazer análise semântica sobre ele; este determinar se um dado nome refere-se a um tipo, uma variável local, um espaço de nome, um grupo método, um campo, e assim por diante. Fazemos tanto "alto nível" análise semântica, para determinar a hierarquia tipo de programa, e "nível de método" análise semântica, para determinar o tipo de cada expressão em cada método. "Nível superior" análise semântica é bastante rápido, e qualquer análise método individual é bastante rápido, mas ainda assim, é difícil fazer uma análise semântica completa entre teclas.

Obviamente que precisamos fazer análise semântica completo para intellisense, mas podemos ir longe com descobrir qual o método que você está digitando, e apenas fazer a análise semântica do nível superior e desse método.

Mas colorização tem que trabalhar em todo o arquivo; você não pode apenas colorir o método que o cursor passa a ser no momento. Portanto, colorização tem que ser insanamente rápido, por isso historicamente temos colorized principalmente com base em informações lexical.

Ocasionalmente, podemos descobrir coisas especiais, como "é esta coisa, provavelmente um tipo?" para dar-lhe uma cor diferente. Mas descobrir quando uma determinada entidade é, digamos, um grupo de método contra, digamos, um campo de tipo delegado, requer um nível de rico bonita de análise semântica, um nível que no momento não executam em cada tecla.

Agora, há coisas que podemos fazer aqui. Poderíamos ser mais inteligentes sobre a compreensão de edições para o fluxo de sinal, e só reexecução análise gramatical e semântico na parte editada de árvore. Estamos fazendo algumas pesquisas nesta área agora, mas é só pesquisa; ele nunca poderia torná-lo realmente no produto.

Outras dicas

Eu acredito que o plugin ReSharper fornece uma sintaxe melhorada destacando como você está falando. Também pode haver outros plugins que fornecem a mesma coisa (a um custo menor) que é simplesmente o uso que eu. Eu concordo destaque de sintaxe é muito útil. ReSharper também faz algumas coisas agradáveis ??como o cinza para fora código morto para torná-lo mais óbvio, destacar a linha atual, etc.

-Daniel

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top