Браузер кода Nemerle: подсветка работает
От: catbert  
Дата: 07.06.10 17:39
Оценка: 27 (3)
Демонстрация по ссылке (хостится прямо на моем компьютере, потому время от времени может быть офлайн):

www.catbert.co.cc/code

Должны правильно подсвечиваться все конструкции языка, кроме идентификаторов типов: сейчас лексер просто угадывает вид идентификатора.

В следующих сериях : навигация, перекрестные ссылки, ссылки на данные из System.Reflection — то есть фичи, для которых код нужно не только парсить, но и типизировать.
Re: Браузер кода Nemerle: подсветка работает
От: VladD2 Российская Империя www.nemerle.org
Дата: 07.06.10 17:44
Оценка:
Здравствуйте, catbert, Вы писали:

C>Демонстрация по ссылке (хостится прямо на моем компьютере, потому время от времени может быть офлайн):


C>www.catbert.co.cc/code


Видимо таки сейчас офлайн.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Браузер кода Nemerle: подсветка работает
От: Воронков Василий Россия  
Дата: 07.06.10 17:46
Оценка:
Здравствуйте, catbert, Вы писали:

C>Демонстрация по ссылке (хостится прямо на моем компьютере, потому время от времени может быть офлайн):

C>www.catbert.co.cc/code

По ходу оффлайн прямо сейчас.
Re[2]: Браузер кода Nemerle: подсветка работает
От: VladD2 Российская Империя www.nemerle.org
Дата: 07.06.10 17:53
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

C>>Демонстрация по ссылке (хостится прямо на моем компьютере, потому время от времени может быть офлайн):

C>>www.catbert.co.cc/code

ВВ>По ходу оффлайн прямо сейчас.


Опубликовал и скрылся

Правда сейчас ответ появился, но он "Bad Request (Invalid Hostname)".
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: Браузер кода Nemerle: подсветка работает
От: catbert  
Дата: 07.06.10 18:10
Оценка:
Здравствуйте, VladD2, Вы писали:

ВВ>>По ходу оффлайн прямо сейчас.


VD>Правда сейчас ответ появился, но он "Bad Request (Invalid Hostname)".


С конфигурацией IIS борюсь

Сейчас вроде нормально должно быть.
Re[4]: Браузер кода Nemerle: подсветка работает
От: VladD2 Российская Империя www.nemerle.org
Дата: 07.06.10 19:02
Оценка:
Здравствуйте, catbert, Вы писали:

C>С конфигурацией IIS борюсь

C>Сейчас вроде нормально должно быть.

Ага. Заработало. Только глюкает пока.

К тому же без проекта типы правильно не подсветить. Плюс строки не подсвечиваются.

Что до клюков, то попытка залить туда код приведенный ниже привела к "Server Error in '/code' Application.".

using System;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Reflection;

using Nemerle.Collections;
using Nemerle.Imperative;
using Nemerle.IO;
using Nemerle.Builtins.Function;
using Nemerle.Utility;

using Nemerle.Compiler;
using Nemerle.Compiler.Parsetree;
//using Nemerle.Compiler.Typedtree;

using Nemerle.Assertions;

using TT = Nemerle.Compiler.Typedtree;
using TExpr = Nemerle.Compiler.Typedtree.TExpr;
using SCG = System.Collections.Generic;
using Debug = System.Diagnostics.Debug;

namespace Nemerle.Data.Linq
{
  /// <summary>
  /// Description of LinqSyntax.
  /// </summary>
  module LinqSyntax
  {
    internal LinqImpl(typer : Typer, expr : PExpr) : PExpr
    {
      match (expr)
      {
        | PExpr.Literal(Literal.String(_) as lit) => 
          ParseAndTranformLinqQuery(typer, expr.Location, lit.RawString)
          
        | PExpr.Call(PExpr.Member(PExpr.Literal(Literal.String(_) as lit) as litExpr, member) as obj, parms) => 
          // this section add support of "linq <# from ... #>.Sum()" syntax
          PExpr.Call(expr.Location, PExpr.Member(obj.Location, 
            ParseAndTranformLinqQuery(typer, litExpr.Location, lit.RawString), member), parms)
          
        | _ => 
          Message.Error(expr.Location, 
            "The 'linq' macro expect string literal with query code (try enclose query in round brackets)");
          <[ () ]>
      }
    }
    
    internal ParseAndTranformLinqQuery(typer : Typer, loc : Location, queryStrLiteral : string) : PExpr
    {
      unless (queryStrLiteral.StartsWith("<#"))
      {
        Message.Error(loc, "The 'linq' macro hould use recursive strinq (<#...#>)");
        return <[ () ]>;
      }
      
      Macros.DefineCTX(typer);
      
      def query = queryStrLiteral.Substring(2, queryStrLiteral.Length - 4);

      def (complMarkLine, complMarkChar) = 
        if (typer.Manager.IsCompletionInProgress)
          (typer.Manager.CompletionMarkLine, typer.Manager.CompletionMarkChar)
        else (-1, -1);

      def lexer = LexerLinq(typer, query, 
        Location(loc, loc.Line, loc.Column + 2, loc.EndLine, loc.EndColumn),
        complMarkLine, complMarkChar);
      
      def expectKeyword(keywordName : string) : void
      {
        def tok = lexer.GetAnyToken();
        
        match (tok)
        {
          | Token.Operator(x) when x == keywordName => () //It's OK!
          | Token.Keyword(x)  when x == keywordName => () //It's OK!
          | _ => 
            Message.Error(tok.Location, $"expected keyword $keywordName but found '$tok'");
            throw ParseErrorException();
        }
      }
      def tryExpectKeyword(keywordName : string) : bool
      {
        def tok = lexer.GetAnyToken();
        
        match (tok)
        {
          | Token.Operator(x) when x == keywordName
          | Token.Keyword(x)  when x == keywordName => true //It's OK!
          | _ => 
            Message.Error(tok.Location, $"expected keyword $keywordName but found '$tok'");
            false
        }
      }
      def tryParseKeyword[T](keyword : string, sucsessContinuation : void -> T, failValue : T) : T
      {
        match (lexer.Peek())
        {
          | Token.Keyword(kwd) when kwd == keyword => 
            _ = lexer.GetAnyToken();
            sucsessContinuation()
          
          | _ => failValue
        }
      }
      def tryPeekAnyToken(tokenName : string) : bool
      {
        def tok = lexer.GetAnyToken();
        lexer.PushBack(tok);
        
        match (tok)
        {
          | Token.Comma with x = ","
          | Token.Operator(x) 
          | Token.Keyword(x)  
          | Token.Identifier(x) => x == tokenName
          | _ => false
        }
      }
      def parseIdentifier() : Name
      {
        def tok = lexer.GetAnyToken();
        
        match (tok)
        {
          | Token.Identifier(name) as tok => Name(name, tok.Location) //It's OK!
          | _ => 
            Message.Error(tok.Location, $"expected identifier but found '$tok'");
            throw ParseErrorException();
        }
      }
      def parseExpr() : PExpr
      {
        def expr = MainParser.ParseExpr(lexer.Env, lexer, false);
        expr
      }
      def parseFromClause(first) : QueryClause.From
      {
        expectKeyword("from");
        def paramName = parseIdentifier();
        expectKeyword("in");
        def expr = parseExpr();
        QueryClause.From(first + expr.Location, paramName, expr)
      }
      def parseSelectClause(first) : QueryClause.Select
      {
        expectKeyword("select");
        def expr = parseExpr();
        QueryClause.Select(first + expr.Location, expr)
      }
      def parseLetClause(first) : QueryClause.Let
      {
        expectKeyword("let");
        def paramName = parseIdentifier();
        expectKeyword("=");
        def expr = parseExpr();
        QueryClause.Let(first + expr.Location, paramName, expr)
      }
      def parseWhereClause(first) : QueryClause.Where
      {
        expectKeyword("where");
        def expr = parseExpr();
        QueryClause.Where(first + expr.Location, expr)
      }
      def parseJoinClause(first) : QueryClause.Join
      {
        expectKeyword("join");
        def ident = parseIdentifier();
        expectKeyword("in");
        def inExpr = parseExpr();
        def (loc, key1Expr, key2Expr, into) = if (tryExpectKeyword("on"))
        {
          def keyExprs = parseExpr();
          def (key1Expr, key2Expr) = match (keyExprs)
          {
            | <[ $key1Expr == $key2Expr ]> => (key1Expr, key2Expr)
            | _ =>
              Message.Error(keyExprs.Location, "expected key1 == key2 expression");
              (keyExprs, <[ () ]>)
              //throw ParseErrorException();
          }
          def into = tryParseKeyword("into", () => Some(parseIdentifier()), None());
          def last = match (into) { | Some(x) => x.Location | _ => key2Expr.Location };
          (first + last, key1Expr, key2Expr, into)
        }
        else (first + inExpr.Location, <[ () ]>, <[ () ]>, None());

        QueryClause.Join(loc, ident, inExpr, key1Expr, key2Expr, into)
      }
      def parseOrderClause(first) : QueryClause.Orderby
      {
        def parseOrderings() : list[PExpr * bool]
        {
          def expr = parseExpr();
          def ascending1 =                 tryParseKeyword("desc",       () => false, true);
          def ascending2 = if (ascending1) tryParseKeyword("descending", () => false, true) // C# syntax
                           else false;
          def ascending3 = if (ascending2) tryParseKeyword("ascending",  () => true,  true) // C# syntax
                           else false;
          
          if (tryPeekAnyToken(","))
          {
            _ = lexer.GetAnyToken();
            (expr, ascending3) :: parseOrderings()
          }
          else (expr, ascending3) :: []
        }
        unless (tryParseKeyword("order", () => { expectKeyword("by"); true }, false))
          expectKeyword("orderby");
        def orderings = parseOrderings();
        def last = if (orderings.IsEmpty) lexer.Location else orderings.Last[0].Location;
        QueryClause.Orderby(first + last, orderings)
      }
      def parseGroupClause(first) : QueryClause.Group
      {
        expectKeyword("group");
        def expr = parseExpr();
        expectKeyword("by");
        def byExpr = parseExpr();
        QueryClause.Group(first + byExpr.Location, expr, byExpr)
      }
      def parseQueryBody() : list[QueryClause]
      {
        def tok = lexer.Peek();
        def first = tok.Location;
        def clause = match (tok)
          {
            | Token.Keyword("from")   => parseFromClause(first)
            | Token.Keyword("select") => parseSelectClause(first)
            | Token.Keyword("let")    => parseLetClause(first)
            | Token.Keyword("where")  => parseWhereClause(first)
            | Token.Keyword("join")   => parseJoinClause(first)
            | Token.Keyword("orderby")
            | Token.Keyword("order")  => parseOrderClause(first)
            | Token.Keyword("group")  => parseGroupClause(first)
            | Token.Keyword("into")   => parseIntoClause(first)
            | Token.EndOfFile => null
            | _ => null 
              //TODO: Add error report
          };
          
        def res = if (clause == null) []
                  else clause :: parseQueryBody();
        res
      }
      and parseIntoClause(first) : QueryClause.Into
      {
        expectKeyword("into");
        def ident = parseIdentifier();
        QueryClause.Into(first + ident.Location, ident)
      }
      def convertQuery(collection : PExpr, queryClauses : list[QueryClause], parms : SCG.List[PExpr]) : PExpr
      {
        def make_x_param(parms : SCG.List[PExpr]) : PExpr
        {
          assert2(!parms.IsEmpty());
          if (parms.Count == 1) parms[0] else PExpr.Tuple(NList.ToList(parms), 1)
        }
        def appendArgToTuple(paramExpr, exprForAppend) : PExpr.Tuple
        {
          match (paramExpr)
          {
            | PExpr.Tuple(args) => PExpr.Tuple.Create(args + [exprForAppend])
            | _                 => PExpr.Tuple.Create([paramExpr, exprForAppend])
          }
        }
        match (queryClauses)
        {
          | QueryClause.From(ident1, inExpr1) :: QueryClause.From(ident2, inExpr2) :: QueryClause.Select(selExpr) :: tail 
          | QueryClause.From(ident1, inExpr1) :: QueryClause.From(ident2, inExpr2) :: tail with selExpr = null =>
            // from x1 in e1 from x2 in e2 ==> e1.SelectMany( x1 => e2 , ( x1 , x2 ) => new { x1 , x2 } )
            def p1 = <[ $(ident1 : name) ]>;
            def p2 = <[ $(ident2 : name) ]>;
            parms.Add(p1);
            parms.Add(p2);
            
            def selExpr2 = if (selExpr == null) <[ ($p1, $p2) ]> else selExpr;
            
            def newCollection = <[ $inExpr1.SelectMany($p1 => $inExpr2,  (($p1, $p2)) => $selExpr2) ]>;
            convertQuery(newCollection, tail, parms)
          
          | QueryClause.From(ident, inExpr) :: tail => 
            parms.Add(<[ $(ident : name) ]>);
            convertQuery(inExpr, tail, parms)
            
          | QueryClause.Where(expr) as clause :: tail =>
            // from x in e
            // where f
            // from x in ( e ) . Where ( x => f )
            def e = collection;
            def x = make_x_param(parms);
            def newCollection = Util.locate(clause.Location, <[ $e.Where($x => $expr) ]>);
            convertQuery(newCollection, tail, parms)

          | QueryClause.Select(expr) :: tail =>
            //TODO: Тут надо как-то извлекать список имен колонок и копировать его в parms
            def x = make_x_param(parms);
            def newCollection = <[ $collection.Select($x => $expr) ]>;
            convertQuery(newCollection, tail, parms)
            
          | QueryClause.Join(ident, inExpr, k1, k2, into) :: tail =>
            // from x1 in e1    join x2 in e2 on k1 equals k2 
            def e1 = collection;
            def e2 = inExpr;
            def x1 = make_x_param(parms);
            def x2 = <[ $(ident : name) ]>;
            def newCollection = match (into)
            {
              | Some(intoName) => 
                def g = <[ $(intoName : name)]>;
                parms.Add(g);
                // e1.GroupJoin(e2 , x1 => k1, x2 => k2, (x1, g) => new { x1 , g })
                def x1_g = appendArgToTuple(x1, g);
                <[ $e1.GroupJoin($e2, $x1 => $k1, $x2 => $k2, ($x1, $g) => $x1_g) ]>;
                
              | None => 
                parms.Add(x2);
                // from * in (e1).Join(e2, x1 => k1, x2 => k2, (x1, x2) => new { x1 , x2 })
                def x1_x2 = appendArgToTuple(x1, x2);
                <[ $e1.Join($e2, $x1 => $k1, $x2 => $k2, ($x1, $x2) => $x1_x2) ]>;
            };
            convertQuery(newCollection, tail, parms)
            
          | QueryClause.Let(ident, expr) :: tail =>
            // from x in e  
            // let y = f
            // from * in ( e ) . Select ( x => new { x , y = f } )
            def e = collection;
            def x = make_x_param(parms);
            def x_f = appendArgToTuple(x, expr);
            def newCollection = <[ $e.Select($x => $x_f) ]>;
            parms.Add(<[ $(ident : name) ]>);
            convertQuery(newCollection, tail, parms)
            
          | QueryClause.Orderby([]) as o :: tail =>
            Message.Error(o.Location, "a orderby clause should contains one or more orderings");
            convertQuery(collection, tail, parms)

          | QueryClause.Orderby((ordExpr, direction) :: tailOrderings) :: tail =>
            // from x in e   orderby k1 , k2 , … , kn  ==>
            // e.OrderBy(x => k1).ThenBy(x => k2). … .ThenBy(x => kn)
            
            def e = collection;
            def x = make_x_param(parms);
            // e.OrderBy(x => k1)
            def newCollection1 = if (direction) <[ $e.OrderBy          ($x => $ordExpr) ]>
                                 else           <[ $e.OrderByDescending($x => $ordExpr) ]>;
            // .ThenBy(x => k2). … .ThenBy(x => kn)
            def convertTailOrderings(x : PExpr, orderings, e : PExpr) : PExpr
            {
              match (orderings)
              {
                | (ordExpr, direction) :: tail =>
                  def new_e = if (direction) <[ $e.ThenBy          ($x => $ordExpr) ]>
                              else           <[ $e.ThenByDescending($x => $ordExpr) ]>;
                  convertTailOrderings(x, tail, new_e)
                  
                | [] => e
              }
            }            
            def newCollection2 = convertTailOrderings(x, tailOrderings, newCollection1);
                                
            convertQuery(newCollection2, tail, parms)
            
          | QueryClause.Group(expr, byExpr) :: tail =>
            // from x in e group v by k
            // e.GroupBy(x => k, x => v)   ||   e.GroupBy(x => k) WHERE v is x
            def e = collection;
            def x = make_x_param(parms);
            def v = expr;
            def k = byExpr;
            def newCollection = <[ $e.GroupBy($x => $k, $x => $v) ]>;
            //TODO: Implement: e.GroupBy(x => k) WHERE v is x
            convertQuery(newCollection, tail, parms)
            
          | QueryClause.Into(ident) :: tail =>
            // from … into x … 
            // from x in ( from … ) …

            // reset all params and add new one (x)
            def newParms = SCG.List();
            newParms.Add(<[ $(ident : name) ]>);
            // try continue convertions
            convertQuery(collection, tail, newParms);
          
          | [] => collection
          | queryClaus :: _ => 
            def clausName = queryClaus.GetType().Name.ToLower();
            Message.Error(queryClaus.Location, $"clause '$clausName' not supported yet");
            collection
        }
      }
      def parseQuery() : list[QueryClause]
      {
        def from = parseFromClause(lexer.Location);
        def queryBody = parseQueryBody();
        def query = from :: queryBody;
        query
      }
      
      typer.Env.Manager.MacroColors.PushUseSiteColor();
      try { convertQuery(null, parseQuery(), SCG.List()) }
      catch { | _ => <[ () ]> }
      finally { typer.Env.Manager.MacroColors.PopColor(); }
    }
  }
}
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: Браузер кода Nemerle: подсветка работает
От: catbert  
Дата: 07.06.10 19:18
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>К тому же без проекта типы правильно не подсветить. Плюс строки не подсвечиваются.


Проект уже есть, вот только от проекта до подсветки типов неблизко.

Строки подсвечиваются, и обычные, и рекурсивные, но вот заметить коричневый цвет на синем фоне сложно

VD>Что до клюков, то попытка залить туда код приведенный ниже привела к "Server Error in '/code' Application.".


Глюк я уже поправил: ASP очень уж заботился о защите кода от XSS
Re[4]: Браузер кода Nemerle: подсветка работает
От: VladD2 Российская Империя www.nemerle.org
Дата: 07.06.10 19:19
Оценка:
Здравствуйте, catbert, Вы писали:

C>Сейчас вроде нормально должно быть.


Вот этот файл приводит к некислым тормозам.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: Браузер кода Nemerle: подсветка работает
От: VladD2 Российская Империя www.nemerle.org
Дата: 07.06.10 19:21
Оценка:
Здравствуйте, catbert, Вы писали:

C>Строки подсвечиваются, и обычные, и рекурсивные, но вот заметить коричневый цвет на синем фоне сложно


Понял. Не подсвечиваются $-строки. Например:
 Message.Error(tok.Location, $"expected keyword $keywordName but found '$tok'");
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: Браузер кода Nemerle: подсветка работает
От: VladD2 Российская Империя www.nemerle.org
Дата: 07.06.10 19:28
Оценка:
Здравствуйте, catbert, Вы писали:

C>Проект уже есть, вот только от проекта до подсветки типов неблизко.


Мне кажется самым правильным подходом для такого как у тебя решения было бы сделать плагин к компилятору, который после завершения компиляции прошелся бы по конечному АСТ и собрал бы всю необходимую информацию для подсветки типов и генерации перекрестных ссылок.

Интеграции нужно работать быстро, по этому она делает множество "приседаний". В твоем же случае можно спокойно дождаться окончания компиляции и пройтись по готовым структрам.

Кстати, интеграция пока что не может работать с проектом компилятора. Если бы твой код смог сгенерировать перекрестные ссылки для кода компилятора, то это очень помогло бы развитию самого компилятора, так как навигация по коду компилятора сильно упростилась бы.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[7]: Браузер кода Nemerle: подсветка работает
От: hardcase Пират http://nemerle.org
Дата: 07.06.10 19:46
Оценка:
Здравствуйте, VladD2, Вы писали:


VD>Кстати, интеграция пока что не может работать с проектом компилятора. Если бы твой код смог сгенерировать перекрестные ссылки для кода компилятора, то это очень помогло бы развитию самого компилятора, так как навигация по коду компилятора сильно упростилась бы.


В SharpDevelop точно работает Class View, правда без наследований, никак не соберусь их прикрутить.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[8]: Браузер кода Nemerle: подсветка работает
От: Воронков Василий Россия  
Дата: 07.06.10 19:50
Оценка:
Здравствуйте, hardcase, Вы писали:

VD>>Кстати, интеграция пока что не может работать с проектом компилятора. Если бы твой код смог сгенерировать перекрестные ссылки для кода компилятора, то это очень помогло бы развитию самого компилятора, так как навигация по коду компилятора сильно упростилась бы.

H>В SharpDevelop точно работает Class View, правда без наследований, никак не соберусь их прикрутить.

А как это связано с Class View? AFAIR Class View и навигация начинают работать в #D, когда ты реализуешь их интерфейсик (что-то типа IParser), который конвертит AST в CodeDom. Но там не совсем та навигация, о которой речь. Для Class View, собственно, и типизация-то не нужна. Навигации же хотелось бы такой же, как в том же Рефлекторе — т.е. внутри тел методов по коду.
Re[5]: Браузер кода Nemerle: подсветка работает
От: catbert  
Дата: 07.06.10 21:24
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Вот этот файл приводит к некислым тормозам.


Да не должен бы в теории... там же только Lexer+PreParser.

Да и на практике не могу заметить тормозов. Возможно, в этот же момент мой комп занимался чем-то процессоро-интенсивным.
Re[7]: Браузер кода Nemerle: подсветка работает
От: catbert  
Дата: 07.06.10 21:29
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Понял. Не подсвечиваются $-строки. Например:

VD>
VD> Message.Error(tok.Location, $"expected keyword $keywordName but found '$tok'"); 
VD>


Пофиксил, в связи с чем вопрос. Есть какая-то вменяемая причина, почему LooseGroup не сохраняет список своих токенов в list[Token], а лишь первый из них?
Re[7]: Браузер кода Nemerle: подсветка работает
От: catbert  
Дата: 07.06.10 21:35
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Мне кажется самым правильным подходом для такого как у тебя решения было бы сделать плагин к компилятору, который после завершения компиляции прошелся бы по конечному АСТ и собрал бы всю необходимую информацию для подсветки типов и генерации перекрестных ссылок.


Приблизительно в этом направлении я работаю. Но мне кажется, можно сделать универсальную "карту" символов для любого языка, чтобы браузер кода работал не только в Nemerle (ну, в стиле PDB).

VD>Кстати, интеграция пока что не может работать с проектом компилятора. Если бы твой код смог сгенерировать перекрестные ссылки для кода компилятора, то это очень помогло бы развитию самого компилятора, так как навигация по коду компилятора сильно упростилась бы.


Ну, учитывая то, что:

VD>Интеграции нужно работать быстро, по этому она делает множество "приседаний". В твоем же случае можно спокойно дождаться окончания компиляции и пройтись по готовым структрам.


не знаю, будет ли мое «спокойное» решение полезно для «быстрой» интеграции.
Re: Браузер кода Nemerle: подсветка работает
От: _nn_ www.nemerleweb.com
Дата: 08.06.10 06:26
Оценка:
Здравствуйте, catbert, Вы писали:

def q = <#
my string
#>;
def p = linq <# from i in a select i #>;
def u = "string";


Все три строки подсвечиваются одинаково.
Мне кажется просто строковой литерал должен подсвечиваться как здесь на rsdn.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[8]: Браузер кода Nemerle: подсветка работает
От: VladD2 Российская Империя www.nemerle.org
Дата: 08.06.10 10:48
Оценка:
Здравствуйте, catbert, Вы писали:

C>Пофиксил, в связи с чем вопрос. Есть какая-то вменяемая причина, почему LooseGroup не сохраняет список своих токенов в list[Token], а лишь первый из них?


Нет. Можешь поправить, если нужно. Только тесты все прогони перед комитом.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[9]: Браузер кода Nemerle: подсветка работает
От: VladD2 Российская Империя www.nemerle.org
Дата: 08.06.10 10:51
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

ВВ>А как это связано с Class View? AFAIR Class View и навигация начинают работать в #D, когда ты реализуешь их интерфейсик (что-то типа IParser), который конвертит AST в CodeDom.


Я тебе уже говорил, что IParser и вся их идеология гнилая. Она только на языки типа шарпа подходит. Как я понял, hardcase разными изворотами прикрутил туда полноценную интеграцию. Так что IParser он попросту обходит (использует не совсем по назначению).

ВВ>Но там не совсем та навигация, о которой речь. Для Class View, собственно, и типизация-то не нужна. Навигации же хотелось бы такой же, как в том же Рефлекторе — т.е. внутри тел методов по коду.


Это да. В студии она работает (с ошибками, пока). Но в студии не грузится проект компилятора. Надо посидеть над этим делом.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[10]: Браузер кода Nemerle: подсветка работает
От: hardcase Пират http://nemerle.org
Дата: 08.06.10 11:33
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Это да. В студии она работает (с ошибками, пока). Но в студии не грузится проект компилятора. Надо посидеть над этим делом.


А я-то сперва думал что запрос на тултип в исходниках компилятора сносил бошку SharpDevelop по моей вине.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[10]: Браузер кода Nemerle: подсветка работает
От: Воронков Василий Россия  
Дата: 08.06.10 11:35
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Я тебе уже говорил, что IParser и вся их идеология гнилая. Она только на языки типа шарпа подходит. Как я понял, hardcase разными изворотами прикрутил туда полноценную интеграцию. Так что IParser он попросту обходит (использует не совсем по назначению).


Насколько я помню, там IParser использовался для фолдинга и Класс-вью. Собственно, и все. А для Класс-Вью зачем типизация?

ВВ>>Но там не совсем та навигация, о которой речь. Для Class View, собственно, и типизация-то не нужна. Навигации же хотелось бы такой же, как в том же Рефлекторе — т.е. внутри тел методов по коду.

VD>Это да. В студии она работает (с ошибками, пока). Но в студии не грузится проект компилятора. Надо посидеть над этим делом.

С самим проектом компилятора нельзя работать из студии?
Re[11]: Браузер кода Nemerle: подсветка работает
От: hardcase Пират http://nemerle.org
Дата: 08.06.10 11:37
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

ВВ>Здравствуйте, VladD2, Вы писали:


VD>>Я тебе уже говорил, что IParser и вся их идеология гнилая. Она только на языки типа шарпа подходит. Как я понял, hardcase разными изворотами прикрутил туда полноценную интеграцию. Так что IParser он попросту обходит (использует не совсем по назначению).


ВВ>Насколько я помню, там IParser использовался для фолдинга и Класс-вью. Собственно, и все. А для Класс-Вью зачем типизация?


Да, именно для этого, а типизация потребуется для установления связей в шарпдевелоповском AST.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[12]: Браузер кода Nemerle: подсветка работает
От: Воронков Василий Россия  
Дата: 08.06.10 11:42
Оценка:
Здравствуйте, hardcase, Вы писали:

VD>>>Я тебе уже говорил, что IParser и вся их идеология гнилая. Она только на языки типа шарпа подходит. Как я понял, hardcase разными изворотами прикрутил туда полноценную интеграцию. Так что IParser он попросту обходит (использует не совсем по назначению).

ВВ>>Насколько я помню, там IParser использовался для фолдинга и Класс-вью. Собственно, и все. А для Класс-Вью зачем типизация?
H>Да, именно для этого, а типизация потребуется для установления связей в шарпдевелоповском AST.

А в каком это виде сейчас? Где-нибудь выложено?
Re[13]: Браузер кода Nemerle: подсветка работает
От: hardcase Пират http://nemerle.org
Дата: 08.06.10 11:46
Оценка: 9 (1)
Здравствуйте, Воронков Василий, Вы писали:

ВВ>А в каком это виде сейчас? Где-нибудь выложено?


Интеграция в SharpDevelop лежит с снипетах. Периодически ковыряется мною в самом SharpDevelop.
/* иЗвиНите зА неРовнЫй поЧерК */
Re: Браузер кода Nemerle: подсветка работает
От: _nn_ www.nemerleweb.com
Дата: 08.06.10 16:08
Оценка:
Здравствуйте, catbert, Вы писали:

C>Демонстрация по ссылке (хостится прямо на моем компьютере, потому время от времени может быть офлайн):


C>www.catbert.co.cc/code


C>Должны правильно подсвечиваться все конструкции языка, кроме идентификаторов типов: сейчас лексер просто угадывает вид идентификатора.


C>В следующих сериях : навигация, перекрестные ссылки, ссылки на данные из System.Reflection — то есть фичи, для которых код нужно не только парсить, но и типизировать.


Нашелся баг.
Берем файл http://code.google.com/p/nemerle/source/browse/nemerle/trunk/macros/core.n вставляем.

Вначале текст выглядит четко, а к концу очень бледно.


Вот код воспроизводящий проблему.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[8]: Браузер кода Nemerle: подсветка работает
От: VladD2 Российская Империя www.nemerle.org
Дата: 08.06.10 16:43
Оценка:
Здравствуйте, catbert, Вы писали:

C>Приблизительно в этом направлении я работаю. Но мне кажется, можно сделать универсальную "карту" символов для любого языка, чтобы браузер кода работал не только в Nemerle (ну, в стиле PDB).


Универсально можно сделать все. Только есть две проблемы:
1. Чем универсальнее делаешь, тем больше работы.
2. Чем универсальнее, тем менее функционально.

В АСТ немерла есть вся нужная информация. А вот как ты сделаешь тоже самое универсально, я представить себе не могу.

C>Ну, учитывая то, что:


VD>>Интеграции нужно работать быстро, по этому она делает множество "приседаний". В твоем же случае можно спокойно дождаться окончания компиляции и пройтись по готовым структрам.


C>не знаю, будет ли мое «спокойное» решение полезно для «быстрой» интеграции.


Оно было бы полезно для развития самого компилятора. Особенно если интеграцию так и не подружат с компилятором.

Твой вариант может быть проще реализован, а значит более надежен, более точен и доступен прямо в вебе.

Минус — скорость получения результата. Но для многих применений — это не такой уж и минус.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: Браузер кода Nemerle: подсветка работает
От: VladD2 Российская Империя www.nemerle.org
Дата: 08.06.10 16:46
Оценка:
Здравствуйте, catbert, Вы писали:

VD>>Вот этот файл приводит к некислым тормозам.


C>Да не должен бы в теории... там же только Lexer+PreParser.


Lexer+PreParser конечно к таким тормозам привести не могут (в той же интеграции они работают молниеносно).
А вот то как формируется текст или даже то какой канал у твоего сервера — может.

Вот ты строки чем формирвешь? StringBuilder-ом?

C>Да и на практике не могу заметить тормозов. Возможно, в этот же момент мой комп занимался чем-то процессоро-интенсивным.


Возможно проблемы в канале или еще чем-то. Но вот я копипэстю содержимое указанного файла, нажимаю кнопку и... ожидаю 6-8 секунд получения результата.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[7]: Браузер кода Nemerle: подсветка работает
От: Воронков Василий Россия  
Дата: 08.06.10 16:57
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Вот ты строки чем формирвешь? StringBuilder-ом?


Даже если складывать строки "+", то объем здесь не настолько велик, чтобы приводить к таким задержкам. Подумаешь, несколько десятков миллионов мелких объектов в куче.

Судя по поведению, дело именно в канале. Запрос-то отрабатывает почти мгновенно, т.е. видно, что страница быстро перезагружается, а потом браузер начинает досасывать сам файл, не шибко маленький.

Кстати, размер HTML можно вполне ужать. К примеру, там нефиговый вью-стейт — причем непонятно, откуда он взялся и на фига он там нужен.
Re[8]: Браузер кода Nemerle: подсветка работает
От: VladD2 Российская Империя www.nemerle.org
Дата: 08.06.10 17:21
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

ВВ>Даже если складывать строки "+", то объем здесь не настолько велик, чтобы приводить к таким задержкам. Подумаешь, несколько десятков миллионов мелких объектов в куче.


Тут ты не прав. При определенных (легко достигаемых) условиях сложение строк может привести к экспоненциальному алгоритму. А это кирдык уже на тысячах объектов.

ВВ>Судя по поведению, дело именно в канале. Запрос-то отрабатывает почти мгновенно, т.е. видно, что страница быстро перезагружается, а потом браузер начинает досасывать сам файл, не шибко маленький.


Возможно, но не уверен. Лучше бы автору самому проверить все.

ВВ>Кстати, размер HTML можно вполне ужать. К примеру, там нефиговый вью-стейт — причем непонятно, откуда он взялся и на фига он там нужен.


Ну, у меня канал широкий...
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[11]: Браузер кода Nemerle: подсветка работает
От: VladD2 Российская Империя www.nemerle.org
Дата: 08.06.10 17:29
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

ВВ>С самим проектом компилятора нельзя работать из студии?


К сожалению, нет. С Интеграцией, можно, а с компилятором нет.

Раньше у меня мозгов не хватало, чтобы решить там все проблемы. Сейчас вроде я до этого дорос, но туго со временем.

Возможно в ближайшее время попробую разобраться.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[9]: Браузер кода Nemerle: подсветка работает
От: Воронков Василий Россия  
Дата: 08.06.10 17:40
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Тут ты не прав. При определенных (легко достигаемых) условиях сложение строк может привести к экспоненциальному алгоритму. А это кирдык уже на тысячах объектов.


А что в данном случае можно такое сотворить со строками, чтобы получить такие тормоза? Считай, минимум 5 секунд лишнего времени. Если сконкатенировать результирующий ХТМЛ через плюсик, то разница по сравнению со стринг-билдером и на глаз заметна не будет.

ВВ>>Кстати, размер HTML можно вполне ужать. К примеру, там нефиговый вью-стейт — причем непонятно, откуда он взялся и на фига он там нужен.

VD>Ну, у меня канал широкий...

Однако это не поможет, если у него — узкий.
Re[12]: Браузер кода Nemerle: подсветка работает
От: Воронков Василий Россия  
Дата: 08.06.10 17:41
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>К сожалению, нет. С Интеграцией, можно, а с компилятором нет.

VD>Раньше у меня мозгов не хватало, чтобы решить там все проблемы. Сейчас вроде я до этого дорос, но туго со временем.
VD>Возможно в ближайшее время попробую разобраться.

А как вы сами-то компилятор правите? Без студии? Честно, даже как-то сложно представить — Влад и без студии
Re[10]: Браузер кода Nemerle: подсветка работает
От: VladD2 Российская Империя www.nemerle.org
Дата: 08.06.10 18:19
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

ВВ>А что в данном случае можно такое сотворить со строками, чтобы получить такие тормоза? Считай, минимум 5 секунд лишнего времени. Если сконкатенировать результирующий ХТМЛ через плюсик, то разница по сравнению со стринг-билдером и на глаз заметна не будет.


Попробуй, вот такой вот безобидный с виду примерчик:
using System.Console;
using Nemerle.Diagnostics;

module Program
{
  Main() : void
  {
    def source = "test ";
    mutable str = "";

    time 
      repeat(40_000)
        str += source;

    WriteLine($"Size: $(str.Length)");
  }
}


ВВ>Однако это не поможет, если у него — узкий.


+1
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[13]: Браузер кода Nemerle: подсветка работает
От: VladD2 Российская Империя www.nemerle.org
Дата: 08.06.10 18:23
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

ВВ>А как вы сами-то компилятор правите? Без студии? Честно, даже как-то сложно представить — Влад и без студии


Без интеграции. В студии, но проект студия понимает как шарповский. При этом подсветка делается путем ассоциации .n-файлов с С++ и добавлением файла с ключевыми словами для С++.

При этом работает только дерево проектов, редактор кода и отладка. Хреновенько конечно, но лучше чем ничего.

Вообще, тут конечно моя лень играет плохую шутку. Давно надо было заставить интеграцию работать с проектом компилятора. Это должно было сильно ускорить работу над ним.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[13]: Браузер кода Nemerle: подсветка работает
От: hardcase Пират http://nemerle.org
Дата: 08.06.10 18:36
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

ВВ>А как вы сами-то компилятор правите? Без студии? Честно, даже как-то сложно представить — Влад и без студии



Я в SharpDevelop-е. Отлаживаю как получится, но как правило методом пристального взгляда.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[11]: Браузер кода Nemerle: подсветка работает
От: Воронков Василий Россия  
Дата: 08.06.10 18:47
Оценка:
Здравствуйте, VladD2, Вы писали:

Такое можно только специально написать На строку в 200 килобайт (хотя там генерится максимум 100) 40 тыс. перевыделений — это несколько крутовато.

Короче, в порядке борьбы за истину, запустил я хттп дебуггер — тот показывает, что практически все время ожидания идет ответ, т.е. "байты капают". А тут два варианта — или там ручками делается флаш или таки канал.
Re[14]: Браузер кода Nemerle: подсветка работает
От: Воронков Василий Россия  
Дата: 08.06.10 19:04
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Я в SharpDevelop-е. Отлаживаю как получится, но как правило методом пристального взгляда.


А там дебагер-то штатный должен был завестись. Или он глючит?
Re[15]: Браузер кода Nemerle: подсветка работает
От: hardcase Пират http://nemerle.org
Дата: 08.06.10 19:33
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

ВВ>Здравствуйте, hardcase, Вы писали:


H>>Я в SharpDevelop-е. Отлаживаю как получится, но как правило методом пристального взгляда.


ВВ>А там дебагер-то штатный должен был завестись. Или он глючит?


Он работает, но SD себя в системе не прописывает, и потому аттачусь к процессу (компилятор предлагает запустить отладку при флаге -debugger) студией. Но это случается если я совсем не понимаю что происходит.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[2]: Браузер кода Nemerle: подсветка работает
От: catbert  
Дата: 08.06.10 20:41
Оценка:
Здравствуйте, _nn_, Вы писали:

__>Все три строки подсвечиваются одинаково.

__>Мне кажется просто строковой литерал должен подсвечиваться как здесь на rsdn.

Как именно?
Re[2]: Браузер кода Nemerle: подсветка работает
От: catbert  
Дата: 08.06.10 20:46
Оценка:
Здравствуйте, _nn_, Вы писали:

__>Вначале текст выглядит четко, а к концу очень бледно.


Бледно выглядит код, помещенный в квазицитату. В вашем примере несбалансированная скобка помещает в квазицитату весь код дальше её самой.

Собственно, "бледность" — один из вариантов Внешний вид кода задается CSS.
Re[12]: Браузер кода Nemerle: подсветка работает
От: catbert  
Дата: 08.06.10 20:51
Оценка:
У меня все генерируется мгновенно, так что проблема в канале.

Да, гигантский ненужный viewstate есть, он отвечает за текст в текстбоксе, куда код писать.

Web-приложение неоптимизированное, написанное под чистые Web Forms, откуда и часть проблем. Если выход сжимать gzip-ом, ответ сервера будет соовсем маленьким.
Re[2]: Браузер кода Nemerle: подсветка работает
От: catbert  
Дата: 08.06.10 22:26
Оценка:
Здравствуйте, _nn_, Вы писали:

__>
__>def q = <#
__>my string
__>#>;
__>def p = linq <# from i in a select i #>;
__>def u = "string"; 
__>


__>Все три строки подсвечиваются одинаково.


В общем случае, подсветку строки в зависимости от того, какой макрос её использует, невозможно реализовать на уровне лексера.

То есть подсветка $-подвыражений внутри $-строк и linq внутри linq-строк будет реализована уже в "следующей версии", когда будут анализироваться PExpr-ы.

Хотя именно для $-строк и linq-строк наверное стоит добавить отдельную поддержку, потому что они часто используются в маленьких сниппетах, где using-и не прописуются.
Re[3]: Браузер кода Nemerle: подсветка работает
От: Ziaw Россия  
Дата: 09.06.10 04:20
Оценка:
Здравствуйте, catbert, Вы писали:

C>Здравствуйте, _nn_, Вы писали:


__>>Вначале текст выглядит четко, а к концу очень бледно.


C>Бледно выглядит код, помещенный в квазицитату. В вашем примере несбалансированная скобка помещает в квазицитату весь код дальше её самой.


Она закрывается после foreach, или я что-то проглядел?
Re[3]: Браузер кода Nemerle: подсветка работает
От: _nn_ www.nemerleweb.com
Дата: 09.06.10 05:04
Оценка:
Здравствуйте, catbert, Вы писали:

C>Здравствуйте, _nn_, Вы писали:


__>>Вначале текст выглядит четко, а к концу очень бледно.


C>Бледно выглядит код, помещенный в квазицитату. В вашем примере несбалансированная скобка помещает в квазицитату весь код дальше её самой.


Поместите весь файл core.n , на каком-то моменте вы увидите , что текст бледнеет.

C>Собственно, "бледность" — один из вариантов Внешний вид кода задается CSS.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[4]: Браузер кода Nemerle: подсветка работает
От: catbert  
Дата: 09.06.10 06:29
Оценка:
Здравствуйте, _nn_, Вы писали:

__>Поместите весь файл core.n , на каком-то моменте вы увидите , что текст бледнеет.


Долго втыкал на подсветку, так и не смог найти места, где она неправильная. Не исключено, что проблема связана с этой — http://rsdn.ru/forum/nemerle/3835775.1.aspx
Автор: VladD2
Дата: 07.06.10
— которую я уже пофиксил.
Re[4]: Браузер кода Nemerle: подсветка работает
От: catbert  
Дата: 09.06.10 06:32
Оценка:
Здравствуйте, Ziaw, Вы писали:

Z>Она закрывается после foreach, или я что-то проглядел?


Да, так и есть, мне раньше казалось, что там скобки несбалансированы.
В любом случае, сейчас все подсвечивается правильно.
Re[5]: Браузер кода Nemerle: подсветка работает
От: _nn_ www.nemerleweb.com
Дата: 09.06.10 06:56
Оценка:
Здравствуйте, catbert, Вы писали:

C>Здравствуйте, _nn_, Вы писали:


__>>Поместите весь файл core.n , на каком-то моменте вы увидите , что текст бледнеет.


C>Долго втыкал на подсветку, так и не смог найти места, где она неправильная. Не исключено, что проблема связана с этой — http://rsdn.ru/forum/nemerle/3835775.1.aspx
Автор: VladD2
Дата: 07.06.10
— которую я уже пофиксил.


Нашлась причина.
Баш у FF 3.6.4RC

Так что все хорошо
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[13]: Браузер кода Nemerle: подсветка работает
От: Воронков Василий Россия  
Дата: 09.06.10 11:12
Оценка:
ViewState у текст-бокса можно отключить, он там не нужен. Просто явно записывай текст туда, а можно даже не показывать исходный текст пока в целях экономии траффика. А в идеале бы тут прикрутить сжатие и с сервером общаться через аякс, чтобы он возвращал только собственно сгенерированный код.
Re[12]: Браузер кода Nemerle: подсветка работает
От: VladD2 Российская Империя www.nemerle.org
Дата: 09.06.10 19:03
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

ВВ>Такое можно только специально написать На строку в 200 килобайт (хотя там генерится максимум 100) 40 тыс. перевыделений — это несколько крутовато.


Такое элементарно получается когда некоторые не очень опытные товарищи начинают формировать строки из мелких фрагментов.

ВВ>Короче, в порядке борьбы за истину, запустил я хттп дебуггер — тот показывает, что практически все время ожидания идет ответ, т.е. "байты капают". А тут два варианта — или там ручками делается флаш или таки канал.


Ну, тады ой. Надо переносить на более шустрй хостинг.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: Браузер кода Nemerle: подсветка работает
От: VladD2 Российская Империя www.nemerle.org
Дата: 09.06.10 22:06
Оценка:
Здравствуйте, catbert, Вы писали:

C>То есть подсветка $-подвыражений внутри $-строк и linq внутри linq-строк будет реализована уже в "следующей версии", когда будут анализироваться PExpr-ы.


Ага. И вообще типы нужно подсвечивать только на основании информации из TExpr-шенов.

C>Хотя именно для $-строк и linq-строк наверное стоит добавить отдельную поддержку, потому что они часто используются в маленьких сниппетах, где using-и не прописуются.


Не стоит. Лексер интеграции изгаляется по этому поводу, потому что анализировать TExpr дороговато для реалтайма. У тебя проблемы времени нет, так что ты можешь подкрасить код "честно".

Так что спеуиальных решений делать не надо.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: Браузер кода Nemerle: подсветка работает
От: VladD2 Российская Империя www.nemerle.org
Дата: 09.06.10 22:11
Оценка: +1
Здравствуйте, catbert, Вы писали:

C>Бледно выглядит код, помещенный в квазицитату. В вашем примере несбалансированная скобка помещает в квазицитату весь код дальше её самой.


А нельзя подсвечивать квази-цитаты так же как в интеграции, добавление серого фона?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: Браузер кода Nemerle: подсветка работает
От: VladD2 Российская Империя www.nemerle.org
Дата: 09.06.10 22:12
Оценка:
Здравствуйте, _nn_, Вы писали:

__>Нашлась причина.

__>Баш у FF 3.6.4RC

А это что, если не секрет?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[7]: Браузер кода Nemerle: подсветка работает
От: _nn_ www.nemerleweb.com
Дата: 10.06.10 07:30
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, _nn_, Вы писали:


__>>Нашлась причина.

__>>Баш у FF 3.6.4RC

VD>А это что, если не секрет?


Тут http://www.mozilla.com/en-US/firefox/all-beta.html
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[14]: Браузер кода Nemerle: подсветка работает
От: catbert  
Дата: 10.06.10 13:26
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

ВВ>ViewState у текст-бокса можно отключить, он там не нужен. Просто явно записывай текст туда, а можно даже не показывать исходный текст пока в целях экономии траффика. А в идеале бы тут прикрутить сжатие и с сервером общаться через аякс, чтобы он возвращал только собственно сгенерированный код.


Ну, это же демка, оптимизировать её нету смысла.
Re[13]: Браузер кода Nemerle: подсветка работает
От: catbert  
Дата: 10.06.10 13:29
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Такое элементарно получается когда некоторые не очень опытные товарищи начинают формировать строки из мелких фрагментов.


HTML формируется StringBuilder’ом.

VD>Ну, тады ой. Надо переносить на более шустрй хостинг.


Nemerle.Compiler использует рефлексию, так что еще не всякий хостинг подойдет. Нужен Full Trust.
Re[4]: Браузер кода Nemerle: подсветка работает
От: catbert  
Дата: 10.06.10 13:48
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Ага. И вообще типы нужно подсвечивать только на основании информации из TExpr-шенов.


Это так, но надо ещё учитывать, что не всегда дело доходит до TExpr-ов, ведь подсвечиваемый код необязательно должен вообще компилироваться без ошибок.
Кроме того, я боюсь, что в некоторых TExpr'ах может быть напутано с локейшнами (в том же $""-макросе), в результате собьется подсветка.

Имея "карту" пространств имен и типов, можно все идентификаторы правильно подсвечивать на основе PExpr где-то на 90%. Но для некоторых фич (например тултип для переменных) анализ TExpr-ов все равно обязателен.

VD>Не стоит. Лексер интеграции изгаляется по этому поводу, потому что анализировать TExpr дороговато для реалтайма. У тебя проблемы времени нет, так что ты можешь подкрасить код "честно".


VD>Так что спеуиальных решений делать не надо.


Есть проблема контекста. Если подсвечивается целый файл в контексте проекта, тогда можно (и следует) пользоватся TExpr-ами. Если подсвечивается сниппет:

static Main() : void
    WriteLine($"Hello, $username")

то тут необходимо догадываться и про $-строки, и про питоновский синтаксис.
Re[5]: Браузер кода Nemerle: подсветка работает
От: VladD2 Российская Империя www.nemerle.org
Дата: 10.06.10 14:01
Оценка:
Здравствуйте, catbert, Вы писали:

C>Это так, но надо ещё учитывать, что не всегда дело доходит до TExpr-ов, ведь подсвечиваемый код необязательно должен вообще компилироваться без ошибок.


Это критично для IDE, но не для подсветки закомиченых исходниках. В них наличие ошибок компиляции — это не штатная ситуация. К тому же компилятор немерла пытается до последнего типизироват даже код с ошибками, так что что-то да будет.

C>Кроме того, я боюсь, что в некоторых TExpr'ах может быть напутано с локейшнами (в том же $""-макросе), в результате собьется подсветка.


Такого тоже быть не должно. Иначе не будет работать хинты и комплит. Так что это тоже ошибка. Можешь закладываться на то, что все должно быть ОК даже в случае с кодом сгенерированным макросами.

C>Имея "карту" пространств имен и типов, можно все идентификаторы правильно подсвечивать на основе PExpr где-то на 90%.


Нельзя. Потом "правильно на 90%" — это означает не правильно.

Компилятор делает множество хитрых вычислений (вывод типов, разрешение перегрузки и т.п.) все они влияют на типы объектов. Чтобы вычислить правильную информацию, тебе придется повторить код компилятора, что сложно и бессмысленно.

C>Но для некоторых фич (например тултип для переменных) анализ TExpr-ов все равно обязателен.


Вот именно! Кроме того еще нужна навигация (гиперссылки как в Рефлекторе). Их тоже нельзя без типизации не выявить. А раз информация о типах все равно используется, то почему бы ее не использовать и для подсветки?

Короче, твой код должен выглядеть примерно так:
def currentPExpr = ...;
match (currentPExpr.TypedObject)
{
  | TExpr.Xxx => анализиурем информацию о типах для получения подсветки, ссылок и подсказок.
  ...
}



C>Есть проблема контекста. Если подсвечивается целый файл в контексте проекта, тогда можно (и следует) пользоватся TExpr-ами. Если подсвечивается сниппет:


C>
C>static Main() : void
C>    WriteLine($"Hello, $username")
C>

C>то тут необходимо догадываться и про $-строки, и про питоновский синтаксис.

Для подсветки уксков вода ничего умного не придумаешь. Тут достаточно просто подсветить их с помощью набора ключевых слов.

Более того это уже сделано минимум два раза. Разве что строки рекурсивные не подсвечиваются как следует. Но это можно пережить.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[9]: Браузер кода Nemerle: подсветка работает
От: catbert  
Дата: 10.06.10 14:06
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Универсально можно сделать все. Только есть две проблемы:

VD>1. Чем универсальнее делаешь, тем больше работы.
VD>2. Чем универсальнее, тем менее функционально.

VD>В АСТ немерла есть вся нужная информация. А вот как ты сделаешь тоже самое универсально, я представить себе не могу.


Ну, цель у нас конкретная:

VD>Мне кажется самым правильным подходом для такого как у тебя решения было бы сделать плагин к компилятору, который после завершения компиляции прошелся бы по конечному АСТ и собрал бы всю необходимую информацию для подсветки типов и генерации перекрестных ссылок.


Вот эта информация и нужна. По сути, описанный плагин можно представить как функцию: TExpr -> ProjectInfo, где ProjectInfo — структура данных, в которой собрана нужная информация. Универсальность лишь в том, чтобы сделать ProjectInfo не специфичным для Немерле.
Re[15]: Браузер кода Nemerle: подсветка работает
От: Воронков Василий Россия  
Дата: 10.06.10 14:06
Оценка: +1
Здравствуйте, catbert, Вы писали:

C>Ну, это же демка, оптимизировать её нету смысла.


Как сказать. Если добавить кнопочку "Скопировать HTML" для сгенерированного кода, то и в таком виде весьма полезно. Например, если надо в какой-нибудь блог вставить раскрашенный код на Немерле.
Re[4]: Браузер кода Nemerle: подсветка работает
От: catbert  
Дата: 10.06.10 14:14
Оценка: 1 (1)
Здравствуйте, VladD2, Вы писали:

VD>А нельзя подсвечивать квази-цитаты так же как в интеграции, добавление серого фона?


Уже. Одной строчкой в CSS. Я экспериментировал с прозрачностью, чтобы было видно цитаты в цитатах.
Re[10]: Браузер кода Nemerle: подсветка работает
От: VladD2 Российская Империя www.nemerle.org
Дата: 10.06.10 14:16
Оценка:
Здравствуйте, catbert, Вы писали:

C>Вот эта информация и нужна. По сути, описанный плагин можно представить как функцию: TExpr -> ProjectInfo, где ProjectInfo — структура данных, в которой собрана нужная информация. Универсальность лишь в том, чтобы сделать ProjectInfo не специфичным для Немерле.


1. Лучше все же анализировать PExpr. В нем есть свойство TypedObject в которое после типизации записывается ссылка на соответствующий TExpr (или другой объект описывающий типы).

2. Кроме PExpr и TExpr еще нужно анализировать и дерево типов.

3. TExpr и есть необходимая тебе информация.

Я бы описал процесс генерации "активной подсветки" (назовем это так) следующим образом.

1. Прогоняем процесс компиляции до стадии на которой начинается типизация тел методв. Запоминаем ссылки на PExpr-оны этих методов.
2. Выполняем типизацию тел методов. После этого у свойствах TypedObject у PExpr-ешонов будут содержаться объекты описывающие типы.
3. Проходим по нетипизированному АСТ и генерируем текст со ссылками и т.п.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[16]: Браузер кода Nemerle: подсветка работает
От: VladD2 Российская Империя www.nemerle.org
Дата: 10.06.10 14:23
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

ВВ>Как сказать. Если добавить кнопочку "Скопировать HTML" для сгенерированного кода, то и в таком виде весьма полезно. Например, если надо в какой-нибудь блог вставить раскрашенный код на Немерле.


Для этого можно воспользоваться:
1. Интеграцией и студией.
2. Авторинш-паком. В нем тоже есть подсветка для Немерла.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: Браузер кода Nemerle: подсветка работает
От: _nn_ www.nemerleweb.com
Дата: 10.06.10 14:36
Оценка: 8 (1)
Здравствуйте, catbert, Вы писали:

C>Здравствуйте, VladD2, Вы писали:


VD>>А нельзя подсвечивать квази-цитаты так же как в интеграции, добавление серого фона?


C>Уже. Одной строчкой в CSS. Я экспериментировал с прозрачностью, чтобы было видно цитаты в цитатах.


Совсем чуть-чуть не хватает.
def x = <[
   decl:
     1
 ]>;

def x = <[
   parameter:
     1
 ]>;


Такой префикс называется «типом цитирования». Вот полный список типов цитирования:

* decl – декларация верхнего уровня. Тип или член типа.
* fundecl – декларация локальной функции.
* case – вхождение оператора match.
* parameter – описание параметра функции.
* ttype – «типизированная» ссылка на тип. При его использовании цитата должна содержать ссылку на тип. Допустима частичная квалификация (с учетом открытых в месте объявления пространств имен).


Это тоже неплохо бы подсвечивать.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[17]: Браузер кода Nemerle: подсветка работает
От: Воронков Василий Россия  
Дата: 10.06.10 14:40
Оценка: +1
Здравствуйте, VladD2, Вы писали:

VD>Для этого можно воспользоваться:

VD>1. Интеграцией и студией.
VD>2. Авторинш-паком. В нем тоже есть подсветка для Немерла.

Ну для первого нужно иметь студию, для второго — офис. Офис нахяву вообще никак, студия практически тоже. Да и не все под виндой сидят.
Re[18]: Браузер кода Nemerle: подсветка работает
От: VladD2 Российская Империя www.nemerle.org
Дата: 10.06.10 16:18
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

ВВ>Ну для первого нужно иметь студию, для второго — офис.


Еще компьютер нужно иметь и электричество!

ВВ>Офис нахяву вообще никак, студия практически тоже.


Какие проблемы со студией то? Качай себе изолэйтед-мод и ставь халявную интеграцию.

ВВ>Да и не все под виндой сидят.


Боюсь, что тогда проблема подсветки кода немерле будет самой меньшей из проблем этого человека.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[19]: Браузер кода Nemerle: подсветка работает
От: catbert  
Дата: 10.06.10 18:09
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Какие проблемы со студией то? Качай себе изолэйтед-мод и ставь халявную интеграцию.


Да в вебе удобней.

ВВ>>Да и не все под виндой сидят.

VD>Боюсь, что тогда проблема подсветки кода немерле будет самой меньшей из проблем этого человека.

Ну, пока нельзя ни скачать, ни собрать Немерле для mono, первой проблемой будет установка.
А решить ее просто: достаточно выложить архив бинарников в загрузки.
Re[18]: Браузер кода Nemerle: подсветка работает
От: catbert  
Дата: 10.06.10 18:38
Оценка: 9 (1)
Здравствуйте, Воронков Василий, Вы писали:

ВВ>Ну для первого нужно иметь студию, для второго — офис. Офис нахяву вообще никак, студия практически тоже. Да и не все под виндой сидят.


Выключил ViewState, включил gzip/deflate.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.