Skip to content

Commit

Permalink
Merge pull request #289 from tomasr/develop
Browse files Browse the repository at this point in the history
v4.3 release merge
  • Loading branch information
tomasr authored Mar 24, 2020
2 parents f51e835 + a377465 commit 7ebf9f6
Show file tree
Hide file tree
Showing 29 changed files with 465 additions and 117 deletions.
2 changes: 2 additions & 0 deletions src/Viasfora.Core/Guids.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@ public static class Guids {
public const String IntellisenseOptions = "8e1de6d1-62e7-4f59-92bf-2b62bfb9c64e";
public const String TextObfuscationOptions = "98cf4318-e4c4-46e0-81c9-d8f22d9a4bcd";
public const String XmlOptions = "8358872a-6e06-4935-912b-0fc0d93b60a8";
public const String XppOptions = "1b1cf0b1-1872-4d6b-b052-0b8223fe5889";
public const String MplOptions = "6fd3c819-4fda-41dc-a6b9-6e32de91ea86";

// Command groups
public const String guidVsfViewCmdSet = "14e93c73-144b-4909-9cdc-694be6125e8c";
Expand Down
8 changes: 3 additions & 5 deletions src/Viasfora.Core/LanguageExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,16 +6,14 @@

namespace Winterdom.Viasfora {
public static class LanguageExtensions {
private static StringComparer comparer = StringComparer.CurrentCultureIgnoreCase;

public static bool IsControlFlowKeyword(this ILanguage lang, String text) {
return lang.Settings.ControlFlow.Contains(lang.NormalizationFunction(text), comparer);
return lang.Settings.ControlFlow.Contains(lang.NormalizationFunction(text), lang.Comparer);
}
public static bool IsVisibilityKeyword(this ILanguage lang, String text) {
return lang.Settings.Visibility.Contains(lang.NormalizationFunction(text), comparer);
return lang.Settings.Visibility.Contains(lang.NormalizationFunction(text), lang.Comparer);
}
public static bool IsLinqKeyword(this ILanguage lang, String text) {
return lang.Settings.Linq.Contains(lang.NormalizationFunction(text), comparer);
return lang.Settings.Linq.Contains(lang.NormalizationFunction(text), lang.Comparer);
}

public static ILanguage TryCreateLanguage(this ILanguageFactory factory, ITextBuffer buffer) {
Expand Down
20 changes: 12 additions & 8 deletions src/Viasfora.Core/Text/KeywordTagger.cs
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ public IEnumerable<ITagSpan<KeywordTag>> GetTags(NormalizedSnapshotSpanCollectio
yield break;
}
ILanguage lang = GetLanguageByContentType(this.theBuffer.ContentType);
ILanguageWithStrings langStr = lang as ILanguageWithStrings;
if ( !lang.Settings.Enabled ) {
yield break;
}
Expand All @@ -73,8 +74,9 @@ where IsInterestingTag(lang, classificationType)
// so that we can process them as a single span
foreach ( var tagSpan in GetTags(interestingSpans, snapshot) ) {
var classificationType = tagSpan.Tag.ClassificationType;
String name = classificationType.Classification.ToLower();
if ( eshe && name.Contains("string") ) {
String name = classificationType.Classification;

if ( eshe && IsString(langStr, name) ) {
foreach ( var escapeTag in ProcessEscapeSequences(lang, name, tagSpan.Span, isCpp) ) {
yield return escapeTag;
}
Expand All @@ -90,15 +92,17 @@ where IsInterestingTag(lang, classificationType)
}
}

private bool IsString(ILanguageWithStrings langStr, string name) {
if ( langStr != null ) {
return langStr.IsStringClassification(name);
}
return name.IndexOf(name, StringComparison.OrdinalIgnoreCase) >= 0;
}

private bool IsInterestingTag(ILanguage lang, IClassificationType classification) {
if ( classification is RainbowTag )
return false;
var name = classification.Classification;
if ( this.settings.EscapeSequencesEnabled && name.IndexOf("string", StringComparison.InvariantCultureIgnoreCase) >= 0 )
return true;
if ( this.settings.KeywordClassifierEnabled && lang.IsKeywordClassification(classification.Classification) )
return true;
return false;
return true;
}

private IEnumerable<ITagSpan<IClassificationTag>> GetTags(IEnumerable<ITagSpan<IClassificationTag>> sourceSpans, ITextSnapshot snapshot) {
Expand Down
29 changes: 23 additions & 6 deletions src/Viasfora.Core/Text/PresentationMode.cs
Original file line number Diff line number Diff line change
Expand Up @@ -53,14 +53,31 @@ private void SetZoomLevel(IWpfTextView textView) {
if ( textView.IsPeekTextWindow() )
return;
if ( this.settings.PresentationModeEnabled ) {
var textViewState = textView.Get<PresentationModeViewState>();
bool pmEnabled() { return textViewState?.Enabled ?? false; }

int zoomLevel = this.state.GetPresentationModeZoomLevel();
// VS2015 supports automatic sync of all text windows with the
// zoom level once you zoom one
// so if the current zoomLevel is not 100%, just ignore it.
if ( textView.ZoomLevel != 100 && this.state.PresentationModeTurnedOn )
return;
textView.ZoomLevel = zoomLevel;

if (this.state.PresentationModeTurnedOn) {
if (!pmEnabled()) {
textView.ZoomLevel = zoomLevel;
textView.Set(new PresentationModeViewState(true));
}
} else {
if ( pmEnabled() ) {
textViewState.Enabled = false;
textView.ZoomLevel = zoomLevel;
}
}
}
}
}

internal class PresentationModeViewState {
public bool Enabled { get; set; }

public PresentationModeViewState(bool state) {
this.Enabled = state;
}
}
}
81 changes: 81 additions & 0 deletions src/Viasfora.Languages/BraceScanners/MplBraceScanner.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
using System;
using Winterdom.Viasfora.Rainbow;
using Winterdom.Viasfora.Util;

namespace Winterdom.Viasfora.Languages.BraceScanners {
public class MplBraceScanner : IBraceScanner {
private enum State {
Text, MultiLineString
}

private State status = State.Text;

public String BraceList => "(){}[]:;";

public MplBraceScanner() {
}

public void Reset(int state) {
this.status = (int)State.Text;
}

public bool Extract(ITextChars tc, ref CharPos pos) {
while ( !tc.AtEnd ) {
switch ( this.status ) {
case State.MultiLineString: String(tc); break;
default:
return Parse(tc, ref pos);
}
}
return false;
}

private bool Parse(ITextChars tc, ref CharPos pos) {
while ( !tc.AtEnd ) {
// Comment.
if ( tc.Char() == '#' ) {
tc.SkipRemainder();
}

// String.
else if ( tc.Char() == '"' ) {
tc.Next();

this.status = State.MultiLineString;
this.String(tc);

continue;
}

// Braces.
else if ( this.BraceList.IndexOf(tc.Char()) >= 0 ) {
pos = new CharPos(tc.Char(), tc.AbsolutePosition);
tc.Next();
return true;
}

// Code.
tc.Next();
}
return false;
}

private void String(ITextChars tc) {
while ( !tc.AtEnd ) {
// End of a String.
if ( tc.Char() == '"' ) {
tc.Next();
this.status = State.Text;
return;
}

// Start of an Escape Sequence.
if ( tc.Char() == '\\' )
tc.Next();

// Content of a String, or an Escaped Character.
tc.Next();
}
}
}
}
6 changes: 6 additions & 0 deletions src/Viasfora.Languages/CSharp.cs
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,16 @@ protected override IBraceScanner NewBraceScanner()
public override IStringScanner NewStringScanner(String classificationName, String text)
=> new CSharpStringScanner(text, classificationName);

public override bool IsKeywordClassification(String classificationType) {
return base.IsKeywordClassification(classificationType)
|| CompareClassification(classificationType, "keyword - control");

}
[ImportingConstructor]
public CSharp(ITypedSettingsStore store) {
this.Settings = new CSharpSettings(store);
}

}

public class CSharpSettings : LanguageSettings {
Expand Down
1 change: 1 addition & 0 deletions src/Viasfora.Languages/ILanguage.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
namespace Winterdom.Viasfora.Languages {
public interface ILanguage {
ILanguageSettings Settings { get; }
StringComparer Comparer { get; }
T GetService<T>();
IStringScanner NewStringScanner(String classificationName, String text);
bool MatchesContentType(Func<String, bool> contentTypeMatches);
Expand Down
7 changes: 7 additions & 0 deletions src/Viasfora.Languages/ILanguageWithStrings.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
using System;

namespace Winterdom.Viasfora.Languages {
public interface ILanguageWithStrings : ILanguage {
bool IsStringClassification(String classificationType);
}
}
2 changes: 2 additions & 0 deletions src/Viasfora.Languages/Langs.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,14 @@ public static class Langs {
public const String FSharp = "FSharp";
public const String JS = "JScript";
public const String Json = "JSON";
public const String Mpl = "MPL";
public const String PowerShell = "PowerShell";
public const String Python = "Python";
public const String R = "R";
public const String Sql = "Sql";
public const String USql = "U-SQL";
public const String TypeScript = "TypeScript";
public const String VB = "VB";
public const String Xpp = "Xpp";
}
}
1 change: 1 addition & 0 deletions src/Viasfora.Languages/LanguageInfo.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ public T GetService<T>() {
}
return default(T);
}
public virtual StringComparer Comparer => StringComparer.OrdinalIgnoreCase;

protected abstract IBraceScanner NewBraceScanner();
protected virtual IFirstLineCommentParser NewFirstLineCommentParser() {
Expand Down
53 changes: 53 additions & 0 deletions src/Viasfora.Languages/Mpl.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
using System;
using System.ComponentModel.Composition;
using Winterdom.Viasfora.Languages.BraceScanners;
using Winterdom.Viasfora.Languages.Sequences;
using Winterdom.Viasfora.Rainbow;
using Winterdom.Viasfora.Settings;
using Winterdom.Viasfora.Util;

namespace Winterdom.Viasfora.Languages {
[Export(typeof(ILanguage))]
public class Mpl : LanguageInfo, ILanguageWithStrings {
public const String ContentType = "MPL";

public override StringComparer Comparer => StringComparer.Ordinal;
protected override String[] SupportedContentTypes
=> new String[] { ContentType };

public ILanguageSettings Settings { get; private set; }

[ImportingConstructor]
public Mpl(ITypedSettingsStore store) {
this.Settings = new MplSettings(store);
}

protected override IBraceScanner NewBraceScanner()
=> new MplBraceScanner();

public override IStringScanner NewStringScanner(String classificationName, String text) {
return new MplStringScanner(text);
}

public override bool IsKeywordClassification(String classificationType) {
var comp = StringComparer.OrdinalIgnoreCase;
return comp.Equals(classificationType, "MplBuiltin");
}
public bool IsStringClassification(String classificationType) {
var comp = StringComparer.OrdinalIgnoreCase;
return comp.Equals(classificationType, "MplText");
}
}

class MplSettings : LanguageSettings {
protected override String[] ControlFlowDefaults => new String[] {
"call", "loop", "if", "ucall", "uif"
};
protected override String[] LinqDefaults => EMPTY;
protected override String[] VisibilityDefaults => EMPTY;

public MplSettings(ITypedSettingsStore store)
: base(Langs.Mpl, store) {
}
}
}
34 changes: 34 additions & 0 deletions src/Viasfora.Languages/Sequences/MplStringScanner.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
using System;
using Winterdom.Viasfora.Util;

namespace Winterdom.Viasfora.Languages.Sequences {
public class MplStringScanner : IStringScanner {
protected ITextChars text;
public MplStringScanner(String text) {
this.text = new StringChars(text, 0, text.Length - 1);
}
public StringPart? Next() {
while ( !this.text.AtEnd ) {
if ( this.text.Char() == '\\' ) {
return ParseEscapeSequence(this.text);
}
this.text.Next();
}
return null;
}

private StringPart? ParseEscapeSequence(ITextChars text) {
// text.Char() == \
int start = text.Position;
text.Next();

char f = text.Char();
text.Next();
if ( f == '\\' || f == '\"' ) {
var span = new TextSpan(start, 2);
return new StringPart(span, StringPartType.EscapeSequence);
}
return null;
}
}
}
5 changes: 5 additions & 0 deletions src/Viasfora.Languages/Viasfora.Languages.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@
<Compile Include="BraceScanners\FortranBraceScanner.cs" />
<Compile Include="BraceScanners\FSharpBraceScanner.cs" />
<Compile Include="BraceScanners\JScriptBraceScanner.cs" />
<Compile Include="BraceScanners\MplBraceScanner.cs" />
<Compile Include="BraceScanners\PsBraceScanner.cs" />
<Compile Include="BraceScanners\PythonBraceScanner.cs" />
<Compile Include="BraceScanners\RBraceScanner.cs" />
Expand All @@ -67,6 +68,7 @@
<Compile Include="CharExtensions.cs" />
<Compile Include="CharPos.cs" />
<Compile Include="CommentParsers\GenericCommentParser.cs" />
<Compile Include="ILanguageWithStrings.cs" />
<Compile Include="Langs.cs" />
<Compile Include="Cpp.cs" />
<Compile Include="CSharp.cs" />
Expand All @@ -84,6 +86,7 @@
<Compile Include="LanguageFactory.cs" />
<Compile Include="LanguageInfo.cs" />
<Compile Include="LanguageSettings.cs" />
<Compile Include="Mpl.cs" />
<Compile Include="PowerShell.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Python.cs" />
Expand All @@ -93,6 +96,7 @@
<Compile Include="Sequences\CssStringScanner.cs" />
<Compile Include="Sequences\CStringScanner.cs" />
<Compile Include="Sequences\FSharpStringScanner.cs" />
<Compile Include="Sequences\MplStringScanner.cs" />
<Compile Include="Sequences\PsStringScanner.cs" />
<Compile Include="Sequences\RStringScanner.cs" />
<Compile Include="Sql.cs" />
Expand All @@ -107,6 +111,7 @@
<Compile Include="Util\TextSpan.cs" />
<Compile Include="VB.cs" />
<Compile Include="XLang.cs" />
<Compile Include="Xpp.cs" />
</ItemGroup>
<ItemGroup>
<None Include="app.config" />
Expand Down
Loading

0 comments on commit 7ebf9f6

Please sign in to comment.